#include #include #include "Stntuple/obj/TStnHeaderBlock.hh" #include "Stntuple/obj/TStnTrackBlock.hh" #include "Stntuple/obj/TStnEvent.hh" #include "Stntuple/obj/TStnPhoton.hh" #include "Stntuple/photon/TPhotonUtil.hh" #include "Stntuple/photon/TCesCprBase.hh" #include "Stntuple/photon/phoconst.hh" using std::cout; using std::endl; ClassImp(TCesCprBase) //_____________________________________________________________________________ TCesCprBase::TCesCprBase() { fPrintLevel = 0; Clear(); return; } //_____________________________________________________________________________ TCesCprBase::~TCesCprBase() { } //_____________________________________________________________________________ void TCesCprBase::SetEvent(TStnEvent* event){ fEvent = event; TStnHeaderBlock* fHeaderBlock = (TStnHeaderBlock*)event->GetDataBlock("HeaderBlock"); fQMc = fHeaderBlock->McFlag(); fRun = fHeaderBlock->RunNumber(); fEvt = fHeaderBlock->EventNumber(); float z; TPhotonUtil::SelectVertex(event, z, fNVz); fChecker.setRunNumber(fRun); } //_____________________________________________________________________________ void TCesCprBase::Clear() { fNEvent = 0; fNCut = 0; fNUsed = 0; fCutoff = 35.0; for(int i=0; i < 8; i++)fCesCprSys[i]=fCprSys[i]=fCesSys[i]=0; fEffNPho=-1; return; } //_____________________________________________________________________________ void TCesCprBase::Print() { printf("Cutoff Et for CES/CPR = %f\n",fCutoff); printf("N Event = %d\n",fNEvent); printf("N failed cuts = %d\n",fNCut); printf("N used in result = %d\n",fNUsed); return; } //_____________________________________________________________________________ Int_t TCesCprBase::OkForCes(TStnPhoton* pho){ int i = 0; if(pho->Etc()<5.0) i += 1; if(pho->Etc()>fCutoff) i += 2; if(!fQMc){ if(!fChecker.GoodCesCluster(pho)) i += 4; } if(pho->Chi2()<0.0 || pho->Chi2()>20.0 ) i += 8; if(fPrintLevel>10) { printf("CesOK Et=%5.1f Chi2=%6.2f i=%2d\n",pho->Etc(),pho->Chi2(),i); } return i; } //_____________________________________________________________________________ Float_t TCesCprBase::CesWeight(TStnPhoton* pho, Float_t& probSignal, Float_t& probBg ){ probSignal = 0.0; probBg = 0.0; for(int i=0; i < 8; i++)fCesSys[i]=0; double es=0, eb=0; float w = fBgComp.getCesWeight(pho->Etc(),pho->Chi2(), es, eb, fCesSys); probSignal = es; probBg = eb; if(fPrintLevel>1) { printf("CesWeight Et=%5.1f probs=%5.3f probb=%5.3f weight=%5.3f\n", pho->Etc(),probSignal,probBg,w); } return w; } //_____________________________________________________________________________ Int_t TCesCprBase::OkForCpr(TStnPhoton* pho){ int i = 0; if(pho->Etc()<5.0) i += 1; if(pho->Etc()XCes())>17.5) i += 8; } if(i==0 && fRun<190000) { TStnTrackBlock* fTrackBlock = (TStnTrackBlock*) fEvent->GetDataBlock("TrackBlock"); int ientry = fEvent->GetCurrentTreeEntry(); fTrackBlock->GetEntry(ientry); pho->fTkcprx = TPhotonUtil::CprTrack(pho, fTrackBlock); if(fabs(pho->fTkcprx)<5.0) i += 16; } // now the fiducial requirements for CP2 if(i==0 && fRun >= 190000){ // not a bad channel and within fiducial of CP2 if(!TPhotonUtil::isCP2Fid(pho)) i+= 4; // does not pass COT end plates |cotz| < 154 if(fabs(TPhotonUtil::GetCOTZ(pho))> PhoConst::COTENDPLATE_Z ) i+= 8; // end of TOF PMT bars if(fabs(TPhotonUtil::GetTOFZ(pho))> PhoConst::TOFPMTEND_Z) i+= 16; } if(fPrintLevel>10) { printf("CprOK Et=%5.1f Tkcprx=%7.2f i=%2d\n", pho->Etc(),pho->fTkcprx,i); } return i; } //_____________________________________________________________________________ Float_t TCesCprBase::CprWeight(TStnPhoton* pho, Float_t& probSignal, Float_t& probBg ){ if(fRun<190000) { return CprWeight2a(pho, probSignal, probBg ); } else { return CprWeight2b(pho, probSignal, probBg ); } } //_____________________________________________________________________________ Float_t TCesCprBase::CprWeight2a(TStnPhoton* pho, Float_t& probSignal, Float_t& probBg ){ probSignal = 0.0; probBg = 0.0; for(int i=0; i < 8; i++)fCprSys[i]=0; double es,eb; double nphobac = -1.0; double cprWeight = fBgComp.getCprWeight( pho->CesCprQ(),pho->Etc(),pho->SinTheta(), es, eb, nphobac, fCprSys, -1.0, fNVz, -1); probSignal = es; probBg = eb; if(fPrintLevel>1) { printf("CprWeight2a nz=%2d Et=%5.1f Q=%5.1f sint=%5.3f probs=%5.3f probb=%5.3f weight=%5.3f\n",fNVz,pho->Etc(),pho->CesCprQ(),pho->SinTheta(),probSignal,probBg,cprWeight); } return cprWeight; } //_____________________________________________________________________________ Float_t TCesCprBase::CprWeight2b(TStnPhoton* pho, Float_t& probSignal, Float_t& probBg ){ probSignal = 0.0; probBg = 0.0; int padIndex[4]; int padE[4]; int cp2sum[3]; int ph=-999; TPhotonUtil::GetCP2(pho, padIndex, padE, cp2sum); ph = cp2sum[2]; pho->fCescprq = ph; double es,eb; double nphobac = -1.0; bool ReachTOFPMT = fabs(TPhotonUtil::GetTOFZ(pho)) >= PhoConst::TOFPMTSTART_Z; for(int i=0; i < 8; i++)fCprSys[i]=0; double cp2Weight = fBgComp.getCprWeight2b( ph,pho->ECorr(),pho->SinTheta(), es, eb, nphobac, fCprSys, fNVz, ReachTOFPMT); fEffNPho = nphobac; probSignal = es; probBg = eb; if(fPrintLevel>1) { printf("CprWeight2b nz=%2d Et=%5.1f Q=%5.1f sint=%5.3f probs=%5.3f probb=%5.3f weight=%5.3f\n",fNVz,pho->Etc(),ph,pho->SinTheta(),probSignal,probBg,cp2Weight); } return cp2Weight; }