#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" using std::cout; using std::endl; ClassImp(TCesCprBase) //_____________________________________________________________________________ TCesCprBase::TCesCprBase() { fPrintLevel = 0; fAllPads = false; 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; 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; // the 0.05 is the Yanwen tune probSignal = fBgComp.phoEff(pho->Etc())-0.05; probBg = fBgComp.backEf(pho->Etc())-0.05; float w = fBgComp.cesWeight(pho->Etc(),pho->Chi2()); 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); if(fRun<190000) { pho->fTkcprx = TPhotonUtil::CprTrack(pho, fTrackBlock); if(fabs(pho->fTkcprx)<5.0) i += 32; //} else { // pho->fTkcprx = TPhotonUtil::Cpr2Track(pho, fTrackBlock); } } 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 CprWeight1b(pho, probSignal, probBg ); } else { return CprWeight2b(pho, probSignal, probBg ); } } //_____________________________________________________________________________ Float_t TCesCprBase::CprWeight1b(TStnPhoton* pho, Float_t& probSignal, Float_t& probBg ){ probSignal = 0.0; probBg = 0.0; double es,eb; double cprsys1, cprsys2, cprsys3, cprsys4, nphobac; nphobac = -1.0; double cprWeight = fBgComp.getCprWeight( pho->CesCprQ(),pho->Etc(),pho->SinTheta(), es, eb, nphobac, cprsys1, cprsys2, cprsys3, cprsys4, -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; // fill the CPR2 pulse height based on choice of using // 4 nearest pads or nearest one or two float CPRzfromCES = pho->VertexZ() + (pho->XCes() - pho->VertexZ())*170.47/184.15; float CPRxfromCES = - pho->XCes()*170.47/184.15; pho->fCescprx = CPRxfromCES; double ph = 0.0; if(fAllPads) { if (pho->Cpr2E(0)>0) ph += pho->Cpr2E(0); if (pho->Cpr2E(1)>0) ph += pho->Cpr2E(1); if (pho->Cpr2E(2)>0) ph += pho->Cpr2E(2); if (pho->Cpr2E(3)>0) ph += pho->Cpr2E(3); } else { //check if the photon path is well-contained in the middle of // one pad. If it is not, use a second pad too. float delx, delz; TPhotonUtil::cp2_close_pad(CPRzfromCES, pho->Phi(), delx, delz); if (delx<=4.25 && delz<=4.25) { if(pho->Cpr2E(0)>0) ph = pho->Cpr2E(0); } else { if(pho->Cpr2E(0)>0) ph += pho->Cpr2E(0); if(pho->Cpr2E(1)>0) ph += pho->Cpr2E(1); } } pho->fCescprq = ph; double es,eb; double cprsys1, cprsys2, cprsys3, cprsys4, nphobac; nphobac = -1.0; double cprWeight = fBgComp.getCprWeight2b( ph,pho->Etc(),pho->SinTheta(), es, eb, nphobac, cprsys1, cprsys2, cprsys3, cprsys4, fNVz, fAllPads); 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,cprWeight); } return cprWeight; }