diff --git a/reco/detectors/tof/CbmTofCalibrator.cxx b/reco/detectors/tof/CbmTofCalibrator.cxx index 4128298264266d3663d24b008faea96610045c28..3174ac1f8d02154b905d71ad915924e33e043c3f 100644 --- a/reco/detectors/tof/CbmTofCalibrator.cxx +++ b/reco/detectors/tof/CbmTofCalibrator.cxx @@ -193,31 +193,19 @@ Bool_t CbmTofCalibrator::CreateCalHist() { 0., TotMax); - TSumMax = 1.; + TSumMax = 0.6; fhCalWalk[iDetIndx].resize(fDigiBdfPar->GetNbChan(iSmType, iRpcId)); for (Int_t iCh = 0; iCh < fDigiBdfPar->GetNbChan(iSmType, iRpcId); iCh++) { fhCalWalk[iDetIndx][iCh].resize(2); for (Int_t iSide = 0; iSide < 2; iSide++) { fhCalWalk[iDetIndx][iCh][iSide] = new TH2D(Form("cal_SmT%01d_sm%03d_rpc%03d_Ch%03d_S%01d_Walk", - iSmType, - iSmId, - iRpcId, - iCh, - iSide), + iSmType, iSmId, iRpcId, iCh, iSide), Form("Walk in SmT%01d_sm%03d_rpc%03d_Ch%03d_S%01d_Walk; Tot " "[a.u.]; #DeltaT [ns]", - iSmType, - iSmId, - iRpcId, - iCh, - iSide), - nbClWalkBinX, - 0., - TotMax, - nbClWalkBinY, - -TSumMax, - TSumMax); + iSmType, iSmId, iRpcId, iCh, iSide), + nbClWalkBinX, 0., TotMax, + nbClWalkBinY, -TSumMax, TSumMax); } } } @@ -285,6 +273,7 @@ void CbmTofCalibrator::FillCalHist(CbmTofTracklet* pTrk) { } CbmMatch* digiMatch = (CbmMatch*) fTofDigiMatchColl->At(iMA); + Double_t hlocal_d[3]; for (Int_t iLink = 0; iLink < digiMatch->GetNofLinks(); iLink += 2) { // loop over digis CbmLink L0 = digiMatch->GetLink(iLink); @@ -309,15 +298,43 @@ void CbmTofCalibrator::FillCalHist(CbmTofTracklet* pTrk) { continue; } + const CbmTofDigi* tDigi1 = fDigiMan->Get<CbmTofDigi>(iDigInd1); + Int_t iCh1 = tDigi1->GetChannel(); + Int_t iSide1 = tDigi1->GetSide(); + LOG(debug) << "Fill Walk for " << iDetIndx << ", TSRCS " << iSmType << iSm + << iRpc << iCh1 << iSide1 << ", " << tDigi1 << ", " << pTrk; + if (iCh1 > (Int_t) fhCalWalk[iDetIndx].size()) { + LOG(error) << "Invalid Ch1 " << iCh1; + continue; + } + if (iSide1 > (Int_t) fhCalWalk[iDetIndx][iCh1].size()) { + LOG(error) << "Invalid Side1 " << iSide1; + continue; + } + + if (iCh0 != iCh1 || iSide0 == iSide1) { + LOG(fatal) <<"Invalid digi pair for TSR "<< iSmType << iSm << iRpc + << " Ch " << iCh0 << " " << iCh1 << ", Side " << iSide0 << " " << iSide1; + } + + hlocal_d[1]=-0.5*((1.-2.*tDigi0->GetSide())*tDigi0->GetTime() + (1.-2.*tDigi1->GetSide())*tDigi1->GetTime()) + * fDigiBdfPar->GetSigVel(iSmType, iSm, iRpc); + + if ( TMath::Abs(hlocal_d[1]-hlocal_p[1])>10.) { + LOG(warn)<<"CMPY for TSRC "<< iSmType << iSm << iRpc << iCh0 + <<": "<<hlocal_f[1]<<", "<<hlocal_p[1]<<", "<<hlocal_d[1] + <<", TOT: " << tDigi0->GetTot() << " " << tDigi1->GetTot(); + } + fhCalWalk[iDetIndx][iCh0][iSide0]->Fill( tDigi0->GetTot(), tDigi0->GetTime() - + (1. - 2. * tDigi0->GetSide()) * hlocal_p[1] + + (1. - 2. * tDigi0->GetSide()) * hlocal_d[1] / fDigiBdfPar->GetSigVel(iSmType, iSm, iRpc) - pTrk->GetFitT( pHit->GetZ()) //-fTrackletTools->GetTexpected(pTrk, iDetId, pHit) + fTofFindTracks->GetTOff(iDetId) - + 2. * (1. - 2. * tDigi0->GetSide()) * (hlocal_p[1] - hlocal_f[1]) + + 2. * (1. - 2. * tDigi0->GetSide()) * (hlocal_d[1] - hlocal_f[1]) / fDigiBdfPar->GetSigVel(iSmType, iSm, iRpc)); /* LOG(info)<<"TSRCS "<<iSmType<<iSm<<iRpc<<iCh<<iSide0<<Form(": digi0 %f, ex %f, prop %f, Off %f, res %f", @@ -329,28 +346,16 @@ void CbmTofCalibrator::FillCalHist(CbmTofTracklet* pTrk) { -(1.-2.*tDigi0->GetSide())*hlocal_f[1]/fDigiBdfPar->GetSigVel(iSmType,iSm,iRpc)); */ - const CbmTofDigi* tDigi1 = fDigiMan->Get<CbmTofDigi>(iDigInd1); - Int_t iCh1 = tDigi1->GetChannel(); - Int_t iSide1 = tDigi1->GetSide(); - LOG(debug) << "Fill Walk for " << iDetIndx << ", TSRCS " << iSmType << iSm - << iRpc << iCh1 << iSide1 << ", " << tDigi1 << ", " << pTrk; - if (iCh1 > (Int_t) fhCalWalk[iDetIndx].size()) { - LOG(error) << "Invalid Ch1 " << iCh1; - continue; - } - if (iSide1 > (Int_t) fhCalWalk[iDetIndx][iCh1].size()) { - LOG(error) << "Invalid Side1 " << iSide1; - continue; - } + fhCalWalk[iDetIndx][iCh1][iSide1]->Fill( tDigi1->GetTot(), tDigi1->GetTime() - + (1. - 2. * tDigi1->GetSide()) * hlocal_p[1] + + (1. - 2. * tDigi1->GetSide()) * hlocal_d[1] / fDigiBdfPar->GetSigVel(iSmType, iSm, iRpc) - pTrk->GetFitT( pHit->GetZ()) //-fTrackletTools->GetTexpected(pTrk, iDetId, pHit) + fTofFindTracks->GetTOff(iDetId) - + 2. * (1. - 2. * tDigi1->GetSide()) * (hlocal_p[1] - hlocal_f[1]) + + 2. * (1. - 2. * tDigi1->GetSide()) * (hlocal_d[1] - hlocal_f[1]) / fDigiBdfPar->GetSigVel(iSmType, iSm, iRpc)); } } @@ -419,7 +424,8 @@ Bool_t CbmTofCalibrator::UpdateCalHist(Int_t iOpt) { fhCorPos[iDetIndx]->SetBinContent(iBin + 1, dCorP + dDp); } } - } break; + } + break; case 2: // update individual channel walks const Double_t MinCounts = 10.; Int_t iNbCh = fDigiBdfPar->GetNbChan(iSmType, iRpc); @@ -432,11 +438,13 @@ Bool_t CbmTofCalibrator::UpdateCalHist(Int_t iOpt) { ->ProjectionX(); // contributing counts Double_t dCorT = 0; - for (Int_t iBin = 0; iBin < fhCorTOff[iDetIndx]->GetNbinsX(); - iBin++) { + for (Int_t iBin = 0; iBin < fhCorWalk[iDetIndx][iCh][iSide]->GetNbinsX(); iBin++) { Double_t dCts = hCW->GetBinContent(iBin + 1); Double_t dWOff = fhCorWalk[iDetIndx][iCh][iSide]->GetBinContent( iBin + 1); // current value + if (iBin>0 && dCts==0) + fhCorWalk[iDetIndx][iCh][iSide]->SetBinContent(iBin + 1, + fhCorWalk[iDetIndx][iCh][iSide]->GetBinContent(iBin) ); if (dCts > MinCounts) { dCorT = hpW->GetBinContent(iBin + 1); } fhCorWalk[iDetIndx][iCh][iSide]->SetBinContent( iBin + 1, dWOff + dCorT); //set new value @@ -444,24 +452,28 @@ Bool_t CbmTofCalibrator::UpdateCalHist(Int_t iOpt) { // determine effective/count rate weighted mean Double_t dMean = 0; Double_t dCtsAll = 0.; - for (Int_t iBin = 0; iBin < fhCorTOff[iDetIndx]->GetNbinsX(); - iBin++) { + for (Int_t iBin = 0; iBin < fhCorWalk[iDetIndx][iCh][iSide]->GetNbinsX(); iBin++) { Double_t dCts = hCW->GetBinContent(iBin + 1); - Double_t dWOff = fhCorWalk[iDetIndx][iCh][iSide]->GetBinContent( - iBin + 1); // current value + Double_t dWOff = fhCorWalk[iDetIndx][iCh][iSide]->GetBinContent(iBin + 1); if (dCts > MinCounts) { dCtsAll += dCts; - dMean += dCts * dWOff; + dMean += dCts * dWOff; } } if (dCtsAll > 0.) dMean /= dCtsAll; + /* + LOG(info)<<"Mean shift for TSRCS "<<iSmType<<iSm<<iRpc<<iCh<<iSide + <<": "<<dMean; + */ // keep mean value at 0 - for (Int_t iBin = 0; iBin < fhCorTOff[iDetIndx]->GetNbinsX(); - iBin++) { - Double_t dWOff = fhCorWalk[iDetIndx][iCh][iSide]->GetBinContent( - iBin + 1); // current value - fhCorWalk[iDetIndx][iCh][iSide]->SetBinContent( - iBin + 1, dWOff - dMean); //set new value + for (Int_t iBin = 0; iBin < fhCorWalk[iDetIndx][iCh][iSide]->GetNbinsX(); iBin++) { + Double_t dWOff = fhCorWalk[iDetIndx][iCh][iSide]->GetBinContent(iBin + 1); // current value + fhCorWalk[iDetIndx][iCh][iSide]->SetBinContent(iBin + 1, dWOff - dMean); //set new value + if(iCh==5 && iBin==10) // debugging + LOG(info) << "New Walk for "<<fhCorWalk[iDetIndx][iCh][iSide]->GetName() + << " bin " << iBin + << ": "<<fhCorWalk[iDetIndx][iCh][iSide]->GetBinContent(iBin+1) + << ", Mean " << dMean<<", WOff "<<dWOff; } } } @@ -517,13 +529,11 @@ void CbmTofCalibrator::ReadHist(TFile* fHist) { fhCorWalk[iDetIndx][iCh].resize(2); for (Int_t iSide = 0; iSide < 2; iSide++) { //LOG(info) << "Get walk histo pointer for TSRCS " << iSmType<<iSm<<iRpc<<iCh<<iSide; - fhCorWalk[iDetIndx][iCh][iSide] = (TH1*) gDirectory->FindObjectAny( + fhCorWalk[iDetIndx][iCh][iSide] = (TH1*) gDirectory->FindObjectAny( Form("Cor_SmT%01d_sm%03d_rpc%03d_Ch%03d_S%d_Walk_px", - iSmType, - iSm, - iRpc, - iCh, - iSide)); + iSmType, iSm, iRpc, iCh, iSide)); + if( NULL == fhCorWalk[iDetIndx][iCh][iSide] ) + LOG(warn)<<"No Walk histo for TSRCS "<<iSmType<<iSm<<iRpc<<iCh<<iSide; } } }