/home/bes3soft/bes3soft/Boss/7.0.2/dist/7.0.2/Reconstruction/Pi0RecAlg/Pi0RecAlg-00-00-06/Pi0RecAlg/Pi0Cut.h

Go to the documentation of this file.
00001 #ifndef __PI0SELECTOR__H
00002 #define __PI0SELECTOR__H
00003 
00004 #include "DecayChain/Function/DCSelectionFunction.h"
00005 #include "BesDChain/CDPi0.h"
00006 #include "EvtRecEvent/EvtRecEvent.h"
00007 #include "EvtRecEvent/EvtRecTrack.h"
00008 #include "EvtRecEvent/EvtRecPi0.h"
00009 
00010 struct UserPi0Cut : public DCSelectionFunction<CDPi0>
00011 {
00012         UserPi0Cut(double MEBP = 0.025, double MEEP = 0.045,
00013                         double MA = 20.,
00014                         double TL = 25.,
00015                         double MinM = 0.12, double MaxM = 0.15,
00016                         double c = 1e+10)
00017                 : MinEnergyOfBarrelPhoton(MEBP), MinEnergyOfEndcapPhoton(MEEP),
00018                 MinAngle(MA), 
00019                 TimeLimit(TL),
00020                 Chisq(c),
00021                 MinMass(MinM), MaxMass(MaxM)
00022                 {}
00023 
00024         double MinEnergyOfBarrelPhoton;
00025         double MinEnergyOfEndcapPhoton;
00026         double MinAngle;
00027         double TimeLimit;
00028         double MinMass;
00029         double MaxMass;
00030         double Chisq;
00031 
00032         bool operator()(CDPi0& _this)
00033         {
00034                 EvtRecTrack* g1 = const_cast<EvtRecTrack*>(_this.navPi0()->hiEnGamma());
00035                 EvtRecTrack* g2 = const_cast<EvtRecTrack*>(_this.navPi0()->loEnGamma());
00036                 if(!isGoodPhoton(g1)) return false;
00037                 if(!isGoodPhoton(g2)) return false;
00038                 if(_this.navPi0()->chisq() > Chisq) return false;
00039                 if(_this.navPi0()->unconMass() < MinMass || _this.navPi0()->unconMass() > MaxMass) return false;
00040                 return true;
00041         }
00042 
00043         bool isGoodPhoton(EvtRecTrack* gTrk)
00044         {
00045                 if ( !gTrk->isEmcShowerValid() ) return false;
00046 
00047                 RecEmcShower *emcTrk = gTrk->emcShower();
00048                 //check time
00049                 if(emcTrk->time() > TimeLimit) return false;
00050                 //check energy
00051                 int flag =(emcTrk->cellId() & 0x000F0000) >> 16;
00052                 if ((flag == 1) && emcTrk->energy() < MinEnergyOfBarrelPhoton) return false;
00053                 if ((flag == 0 || flag == 2) && emcTrk->energy() < MinEnergyOfEndcapPhoton) return false;
00054                 //check angle
00055                 Hep3Vector emcpos(emcTrk->x(), emcTrk->y(), emcTrk->z());
00056                 if (recEvt->totalCharged() > 0)
00057                 {
00058                         double dthe = 200.;
00059                         double dphi = 200.;
00060                         double dang1 = 200.;
00061                         for (int j = 0; j < recEvt->totalCharged(); j++) {
00062                                 EvtRecTrackIterator jtTrk = recTrkCol->begin() + j;
00063                                 if ( !(*jtTrk)->isExtTrackValid() ) continue;
00064                                 RecExtTrack* extTrk = (*jtTrk)->extTrack();
00065                                 if ( extTrk->emcVolumeNumber() == -1 ) continue;
00066                                 Hep3Vector extpos = extTrk->emcPosition();
00067                                 double  angd1 = extpos.angle(emcpos);
00068                                 double  thed = extpos.theta() - emcpos.theta();
00069                                 double  phid = extpos.deltaPhi(emcpos);
00070                                 thed = fmod(thed+CLHEP::twopi+CLHEP::twopi+CLHEP::pi, CLHEP::twopi) - CLHEP::pi;
00071                                 phid = fmod(phid+CLHEP::twopi+CLHEP::twopi+CLHEP::pi, CLHEP::twopi) - CLHEP::pi;
00072 
00073                                 if ( fabs(thed) < fabs(dthe) ) dthe = thed;
00074                                 if ( fabs(phid) < fabs(dphi) ) dphi = phid;
00075                                 if ( angd1 < dang1 ) dang1 = angd1;
00076                         }
00077                         if ( dang1 < 200 ) {
00078                                 dthe = dthe * 180 / (CLHEP::pi);
00079                                 dphi = dphi * 180 / (CLHEP::pi);
00080                                 dang1 = dang1 * 180 / (CLHEP::pi);
00081                                 if ( dang1 < MinAngle) return false;
00082 
00083 
00084                         }  // End of "dang1 < 200" IF 
00085 
00086                 }  // End of "recEv
00087                 return true;
00088         }
00089         public:
00090         static void SetForTrack(EvtRecEvent* _recEvt, EvtRecTrackCol* _recTrkCol){ recEvt =_recEvt; recTrkCol=_recTrkCol;}
00091         static EvtRecEvent* recEvt;
00092         static EvtRecTrackCol* recTrkCol;
00093 };
00094 namespace Pi0{
00095         extern UserPi0Cut VeryLoosePi0Cut;
00096         extern UserPi0Cut DefaultPi0Cut;
00097 }
00098 #endif

Generated on Tue Nov 29 23:13:46 2016 for BOSS_7.0.2 by  doxygen 1.4.7