//*-- Author : Dan Magestro
//*-- Created: 06/09/01
//*-- Last modified: 07/11/01
//_HADES_CLASS_DESCRIPTION
/////////////////////////////////////////////////////////////////////////
//
// HCutLeptonId - cuts on track/rich or particle/rich combinations
//
// BEGIN_HTMLFor more information, see the PhyAna documentation. END_HTML
//
/////////////////////////////////////////////////////////////////////////
using namespace std;
#include
#include
#include
#include
#include
#include
#include
#include "phyanadef.h"
#include "hcutleptonid.h"
#include "hcut.h"
#include "hkicktrack.h"
#include "kickdef.h"
#include "hparticle.h"
#include "hrichhit.h"
#include "hades.h"
#include "hiterator.h"
#include "hcategory.h"
#include "hphysicsconstants.h"
#include "hrecevent.h"
#include "hlocation.h"
HCutLeptonId::HCutLeptonId() : HCut() {
// Default constructor
kFlagTofinoTof = kFALSE;
kFlagTofTof = kFALSE;
kFlagShowerSum = kFALSE;
kFlagThetaDiff = kFALSE;
kFlagPhiDiff = kFALSE;
kFlagRingPatMat = kFALSE;
kFlagRingHouTra = kFALSE;
}
HCutLeptonId::HCutLeptonId(const Text_t *name, const Text_t *title)
: HCut(name, title) {
kFlagTofinoTof = kFALSE;
kFlagTofTof = kFALSE;
kFlagShowerSum = kFALSE;
kFlagThetaDiff = kFALSE;
kFlagPhiDiff = kFALSE;
kFlagRingPatMat = kFALSE;
kFlagRingHouTra = kFALSE;
}
void HCutLeptonId::reset() {
// Disables all cuts by resetting to kFALSE
kFlagTofinoTof = kFALSE;
kFlagTofTof = kFALSE;
kFlagShowerSum = kFALSE;
kFlagThetaDiff = kFALSE;
kFlagPhiDiff = kFALSE;
kFlagRingPatMat = kFALSE;
kFlagRingHouTra = kFALSE;
return;
}
void HCutLeptonId::setStandardCuts() {
// Not implemented yet
return;
}
void HCutLeptonId::printCutList() {
// Prints a table of enabled cuts to stdio
printf("\n--------------------------------------------\n");
printf(" HCutLeptonId cuts \n");
printf(" ------------------ \n");
if(kFlagTofinoTof)
printf("fMinTofinoTof = %4.1f fMaxTofinoTof = %4.1f\n",fMinTofinoTof,fMaxTofinoTof);
if(kFlagTofTof)
printf("fMinTofTof = %4.1f fMaxTofTof = %4.1f\n",fMinTofTof,fMaxTofTof);
if(kFlagShowerSum)
printf("fShowerSum10 = %4.1f fShowerSum20 = %4.1f\n",fShowerSum10,fShowerSum20);
if(kFlagThetaDiff)
printf("fMinThetaDiff = %4.1f fMaxThetaDiff = %4.1f\n",fMinThetaDiff,fMaxThetaDiff);
if(kFlagPhiDiff)
printf("fMinPhiDiff = %4.1f fMaxPhiDiff = %4.1f\n",fMinPhiDiff,fMaxPhiDiff);
if(kFlagRingPatMat)
printf("fMinRingPatMat= %4.1f fMaxRingPatMat= %4.1f\n",fMinRingPatMat,fMaxRingPatMat);
if(kFlagRingHouTra)
printf("fMinRingHouTra= %4.1f fMaxRingHouTra= %4.1f\n",fMinRingHouTra,fMaxRingHouTra);
printf("--------------------------------------------\n\n");
return;
}
Int_t HCutLeptonId::check(HRichHit *ring, HParticle *part) {
// Checks one particle and ring and returns 1 if cuts are satisfied
Float_t r2d = 57.29578;
fNCheck++;
// Get HKickTrack object from HParticle trackId
HCategory *trackCat = gHades->getCurrentEvent()->getCategory(catKickTrack);
HKickTrack *track = (HKickTrack*) trackCat->getObject( part->getTrackId() );
// Time-of-flight check on track
Float_t tof = track->getTof();
if(kFlagTofinoTof) {
if( track->getSystem() == 0 &&
(tof>fMaxTofinoTof || tofgetSystem() == 1 &&
(tof>fMaxTofTof || tofiRingHouTra < fMinRingHouTra ||
ring->iRingHouTra > fMaxRingHouTra ) {
fnRingHouTra++;
return kFALSE;
}
}
if(kFlagRingPatMat) {
if( ring->iRingPatMat < fMinRingPatMat ||
ring->iRingPatMat > fMaxRingPatMat ) {
fnRingPatMat++;
return kFALSE;
}
}
// Shower multiplication factor check on track
if(kFlagShowerSum) {
if( track->getSystem() == 0 &&
( track->getShowerSum10(1.) < fShowerSum10 ||
track->getShowerSum20(1.) < fShowerSum20 ) ) {
fnShowerSum++;
return kFALSE;
}
}
// Angular correlation check on part - ring
if(kFlagThetaDiff) {
Float_t ringTheta = ring->getTheta();
Float_t partTheta = part->Theta()*r2d;
if( ringTheta-partTheta < fMinThetaDiff ||
ringTheta-partTheta > fMaxThetaDiff ) {
fnThetaDiff++;
return kFALSE;
}
}
if(kFlagPhiDiff) {
Float_t ringPhi = ring->getPhi();
Float_t partPhi = part->Phi()*r2d + (part->Phi()<0.)*360.;
if( ringPhi-partPhi < fMinPhiDiff ||
ringPhi-partPhi > fMaxPhiDiff ) {
fnPhiDiff++;
return kFALSE;
}
}
fNGood++;
return kTRUE;
}
Int_t HCutLeptonId::check(HRichHit *ring, HKickTrack *track) {
// Checks one track and ring and returns 1 if cuts are satisfied
// Note: tracks are rotated into the cave system simply by rotating
// phi by multiples of 60. The correct way (used in HParticleFiller,
// for example) is to use HSpecGeomPar for the rotation.
Float_t r2d = 57.29578;
fNCheck++;
// Time-of-flight check on track
Float_t tof = track->getTof();
if(kFlagTofinoTof) {
if( track->getSystem() == 0 &&
(tof>fMaxTofinoTof || tofgetSystem() == 1 &&
(tof>fMaxTofTof || tofiRingHouTra < fMinRingHouTra ||
ring->iRingHouTra > fMaxRingHouTra ) {
fnRingHouTra++;
return kFALSE;
}
}
if(kFlagRingPatMat) {
if( ring->iRingPatMat < fMinRingPatMat ||
ring->iRingPatMat > fMaxRingPatMat ) {
fnRingPatMat++;
return kFALSE;
}
}
// Shower multiplication factor check on track
if(kFlagShowerSum) {
if( track->getSystem() == 0 &&
( track->getShowerSum10(1.) < fShowerSum10 ||
track->getShowerSum20(1.) < fShowerSum20 ) ) {
fnShowerSum++;
return kFALSE;
}
}
// Angular correlation check on track - ring
if(kFlagThetaDiff) {
Float_t ringTheta = ring->getTheta();
Float_t trackTheta = track->getTheta()*r2d;
if( ringTheta-trackTheta < fMinThetaDiff ||
ringTheta-trackTheta > fMaxThetaDiff ) {
fnThetaDiff++;
return kFALSE;
}
}
if(kFlagPhiDiff) {
Float_t ringPhi = ring->getPhi();
Float_t trackPhi = track->getPhi()*r2d + (track->getSector()*60.);
if(trackPhi > 360.) trackPhi-= 360.;
if( ringPhi-trackPhi < fMinPhiDiff ||
ringPhi-trackPhi > fMaxPhiDiff ) {
fnPhiDiff++;
return kFALSE;
}
}
fNGood++;
return kTRUE;
}
ClassImp(HCutLeptonId)