CbmTofFindTracks.cxx 91.09 KiB
// -------------------------------------------------------------------------
// ----- CbmTofFindTracks source file -----
// ----- Created 25/04/15 by N. Herrmann -----
// ----- initially following CbmTrdFindTracks -----
// -------------------------------------------------------------------------
#include "CbmTofFindTracks.h"
#include "CbmTofAddress.h" // in cbmdata/tof
#include "CbmEvent.h"
#include "CbmMatch.h"
#include "CbmTofCalibrator.h"
#include "CbmTofCell.h" // in tof/TofData
#include "CbmTofCreateDigiPar.h" // in tof/TofTools
#include "CbmTofDetectorId_v12b.h" // in cbmdata/tof
#include "CbmTofDetectorId_v14a.h" // in cbmdata/tof
#include "CbmTofDetectorId_v21a.h" // in cbmdata/tof
#include "CbmTofDigiBdfPar.h" // in tof/TofParam
#include "CbmTofDigiPar.h" // in tof/TofParam
#include "CbmTofGeoHandler.h" // in tof/TofTools
#include "CbmTofHit.h"
#include "CbmTofTrackFinder.h"
#include "CbmTofTrackFinderNN.h"
#include "CbmTofTrackFitter.h"
#include "CbmTofTracklet.h"
#include "CbmTofTrackletTools.h"
#include "CbmVertex.h"
#include "FairLogger.h"
#include "FairRootManager.h"
#include "FairRunAna.h"
#include "FairRuntimeDb.h"
#include "TClonesArray.h"
#include "TDirectory.h"
#include "TF1.h"
#include "TFile.h"
#include "TFitResult.h"
#include "TGeoManager.h"
#include "TH1.h"
#include "TH2.h"
#include "TH3.h"
#include "TMath.h"
#include "TProfile.h"
#include "TROOT.h"
#include "TRandom.h"
#include "TSpectrum.h"
#include "TString.h"
#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;
//const Int_t DetMask = 0x3FFFFF; // check for consistency with v14a geometry
const Int_t DetMask = 0x1FFFFF; // check for consistency with v21a geometry
ClassImp(CbmTofFindTracks);
CbmTofFindTracks* CbmTofFindTracks::fInstance = 0;
// ----- Default constructor -------------------------------------------
CbmTofFindTracks::CbmTofFindTracks()
: CbmTofFindTracks::CbmTofFindTracks("TofFindTracks", "Main", NULL) {
if (!fInstance) fInstance = this;
}
// -------------------------------------------------------------------------
// ----- Standard constructor ------------------------------------------
CbmTofFindTracks::CbmTofFindTracks(const char* name,
const char* /*title*/,
CbmTofTrackFinder* finder)
: FairTask(name)
, fFinder(finder)
, fFitter(NULL)
, fTrackletTools(NULL)
, fTofCalibrator(NULL)
, fEventsColl(NULL)
, fTofHitArrayIn(NULL)
, fTofMatchArrayIn(NULL)
, fTofHitArray(NULL)
, fTrackArray(NULL)
, fTrackArrayOut(nullptr)
, fTofUHitArray(NULL)
, fMinNofHits(-1)
, fNofTracks(-1)
, fNTofStations(-1)
, fNReqStations(-1)
, fInspectEvent(kTRUE)
, fStationType()
, fStationHMul()
, fRpcAddr()
, fMapStationRpcId()
, fMapRpcIdParInd()
, fhTrklMul(NULL)
, fhTrklChi2(NULL)
, fhAllHitsStation(NULL)
, fhAllHitsSmTypes(NULL)
, fhUsedHitsStation(NULL)
, fhTrackingTimeNhits(NULL)
, fhTrklMulNhits(NULL)
, fhTrklMulMaxMM(NULL)
, fhTrklMul3D(NULL)
, fhTrklHMul(NULL)
, fhTrklZ0xHMul(NULL)
, fhTrklZ0yHMul(NULL)
, fhTrklTxHMul(NULL)
, fhTrklTyHMul(NULL)
, fhTrklTtHMul(NULL)
, fhTrklVelHMul(NULL)
, fhTrklT0HMul(NULL)
, fhTrklT0Mul(NULL)
, fhTrklDT0SmMis(NULL)
, fhTrklDT0StMis2(NULL)
, fhTrklXY0_0(NULL)
, fhTrklXY0_1(NULL)
, fhTrklXY0_2(NULL)
, vhPullX()
, vhPullY()
, vhPullZ()
, vhPullT()
, vhPullTB()
, vhResidualTBWalk()
, vhResidualYWalk()
, vhXY_AllTracks()
, vhXY_AllStations()
, vhXY_MissedStation()
, vhXY_DX()
, vhXY_DY()
, vhXY_DT()
, vhXY_TOT()
, vhXY_CSZ()
, vhUDXDY_DT()
, vhUCDXDY_DT()
, fhVTXNorm(NULL)
, fhVTX_XY0(NULL)
, fhVTX_DT0_Norm(NULL)
, fOutHstFileName("")
, fCalParFileName("")
, fCalOutFileName("./tofFindTracks.hst.root")
, fCalParFile(NULL)
, fhPullT_Smt(NULL)
, fhPullT_Smt_Off(NULL)
, fhPullX_Smt(NULL)
, fhPullX_Smt_Off(NULL)
, fhPullY_Smt(NULL)
, fhPullY_Smt_Off(NULL)
, fhPullZ_Smt(NULL)
, fhPullZ_Smt_Off(NULL)
, fhPullT_Smt_Width(NULL)
, fhPullX_Smt_Width(NULL)
, fhPullY_Smt_Width(NULL)
, fhPullZ_Smt_Width(NULL)
, fhTOff_Smt(NULL)
, fhTOff_Smt_Off(NULL)
, fhDeltaTt_Smt(NULL)
, fhTOff_HMul2(NULL)
, fiCorMode(0)
, fiBeamCounter(-1)
, fiStationMaxHMul(1000)
, fTtTarg(30.)
, fVTXNorm(0.)
, fVTX_T(0.)
, fVTX_X(0.)
, fVTX_Y(0.)
, fVTX_Z(0.)
, fT0MAX(0.5)
, fiEvent(0)
, fGeoHandler(new CbmTofGeoHandler())
, fTofId(NULL)
, fDigiPar(NULL)
, fDigiBdfPar(NULL)
, fSIGT(0.1)
, fSIGX(1.)
, fSIGY(1.)
, fSIGZ(1.)
, fbUseSigCalib(kTRUE)
, fdRefVelMean(0.)
, fdRefDVel(1.E7)
, fdR0Lim(0.)
, fStart()
, fStop()
, fdTrackingTime(0.)
, fdBeamMomentumLab(0.)
, fbRemoveSignalPropagationTime(kFALSE)
, fiBeamMaxHMul(1000)
, fiCalOpt(0) {
if (!fInstance) fInstance = this;
}
// -------------------------------------------------------------------------
// ----- Destructor ----------------------------------------------------
CbmTofFindTracks::~CbmTofFindTracks() {
if (fInstance == this) fInstance = 0;
fTrackArray->Delete();
}
// -------------------------------------------------------------------------
// ----- Public method Init (abstract in base class) --------------------
InitStatus CbmTofFindTracks::Init() {
// Check for Track finder
if (!fFinder) {
cout << "-W- CbmTofFindTracks::Init: No track finder selected!" << endl;
return kERROR;
}
// Check for Track fitter
if (!fFitter) {
cout << "-W- CbmTofFindTracks::Init: No track fitter selected!" << endl;
return kERROR;
}
cout << Form("-D- CbmTofFindTracks::Init: track fitter at 0x%p", fFitter)
<< endl;
fTrackletTools = new CbmTofTrackletTools(); // initialize tools
// Get and check FairRootManager
FairRootManager* ioman = FairRootManager::Instance();
if (!ioman) {
cout << "-E- CbmTofFindTracks::Init: "
<< "RootManager not instantiated!" << endl;
return kFATAL;
}
ioman->InitSink();
fEventsColl = dynamic_cast<TClonesArray*>(ioman->GetObject("Event"));
if (!fEventsColl)
fEventsColl = dynamic_cast<TClonesArray*>(ioman->GetObject("CbmEvent"));
if (!fEventsColl) {
LOG(info) << "CbmEvent not found in input file, assume eventwise input";
} else {
fTofHitArray = new TClonesArray("CbmTofHit");
}
// Get TOF hit Array
fTofHitArrayIn = (TClonesArray*) ioman->GetObject("TofHit");
if (!fTofHitArrayIn) {
LOG(fatal) << "-W- CbmTofFindTracks::Init: No TofHit array!";
return kERROR;
}
// Get TOF hit Array
fTofMatchArrayIn = (TClonesArray*) ioman->GetObject("TofCalDigiMatch");
if (!fTofMatchArrayIn) {
LOG(fatal) << "CbmTofFindTracks::Init: No TofDigiMatch array!";
return kERROR;
}
// Create and register output TofTrack array
fTrackArray = new TClonesArray("CbmTofTracklet", 100);
fTofUHitArray = new TClonesArray("CbmTofHit", 100);
//fTrackArray->BypassStreamer(kTRUE); //needed?
//ioman->Register("TofTracks", "TOF", fTrackArray, kFALSE); //FIXME
if (fEventsColl) {
fTrackArrayOut = new TClonesArray("CbmTofTracklet", 100);
ioman->Register(
"TofTracks", "TOF", fTrackArrayOut, kTRUE); //FIXME, does not work !
} else {
ioman->Register(
"TofTracks", "TOF", fTrackArray, kTRUE); //FIXME, does not work !
cout << "-I- CbmTofFindTracks::Init:TofTrack array registered" << endl;
// Create and register TofUHit array for unused Hits
ioman->Register("TofUHit", "TOF", fTofUHitArray, kFALSE);
}
// Call the Init method of the track finder
fFinder->Init();
if (fOutHstFileName == "") { fOutHstFileName = "./FindTofTracks.hst.root"; }
LOG(info) << "CbmTofFindTracks::Init: Hst Output filename = "
<< fOutHstFileName;
if (kFALSE == InitParameters()) return kFATAL;
// default parameters
// if (fMinNofHits < 1) fMinNofHits=1;
//fill RpcId - map
Bool_t bBeamCounter = kFALSE;
Int_t iRpc = 0;
for (Int_t iCell = 0; iCell < fDigiPar->GetNrOfModules(); iCell++) {
Int_t iCellId = fDigiPar->GetCellId(iCell);
Int_t iCh = fTofId->GetCell(iCellId);
if (0 == iCh) {
LOG(info) << Form(
"Init found RpcInd %d at Addr 0x%08x, ModType %d, ModId %d, RpcId %d ",
iRpc,
iCellId,
fTofId->GetSMType(iCellId),
fTofId->GetSModule(iCellId),
fTofId->GetCounter(iCellId));
if (fTofId->GetSMType(iCellId) == 5) {
bBeamCounter = kTRUE;
LOG(info) << "Found beam counter in setup!";
}
fMapRpcIdParInd[iCellId] = iRpc;
fRpcAddr.resize(fRpcAddr.size() + 1);
fRpcAddr.push_back(iCellId);
iRpc++;
}
}
fStationHMul.resize(fNTofStations + 1);
LoadCalParameter();
CreateHistograms();
if (fiCalOpt > 0) {
fTofCalibrator = new CbmTofCalibrator();
if (fTofCalibrator->Init() != kSUCCESS) return kFATAL;
if (bBeamCounter) {
fTofCalibrator->SetBeam(bBeamCounter);
fTofCalibrator->SetR0Lim(
fdR0Lim); // FIXME, hardwired parameter for debugging
LOG(info) << "Set CbmTofCalibrator::R0Lim to " << fdR0Lim;
}
}
LOG(info) << Form("BeamCounter to be used in tracking: 0x%08x",
fiBeamCounter);
return kSUCCESS;
}
// -------------------------------------------------------------------------
/************************************************************************************/
Bool_t CbmTofFindTracks::LoadCalParameter() {
if (fCalParFileName.IsNull()) return kTRUE;
fCalParFile = new TFile(fCalParFileName, "");
if (NULL == fCalParFile) {
LOG(error) << "CbmTofFindTracks::LoadCalParameter: "
<< "file " << fCalParFileName << " does not exist!";
return kTRUE;
}
LOG(info) << "CbmTofFindTracks::LoadCalParameter: "
<< " read from file " << fCalParFileName;
TH1D* fhtmp = (TH1D*) gDirectory->FindObjectAny(Form("hPullT_Smt_Off"));
TH1D* fhtmpX = (TH1D*) gDirectory->FindObjectAny(Form("hPullX_Smt_Off"));
TH1D* fhtmpY = (TH1D*) gDirectory->FindObjectAny(Form("hPullY_Smt_Off"));
TH1D* fhtmpZ = (TH1D*) gDirectory->FindObjectAny(Form("hPullZ_Smt_Off"));
TH1D* fhtmpW = (TH1D*) gDirectory->FindObjectAny(Form("hPullT_Smt_Width"));
TH1D* fhtmpWX = (TH1D*) gDirectory->FindObjectAny(Form("hPullX_Smt_Width"));
TH1D* fhtmpWY = (TH1D*) gDirectory->FindObjectAny(Form("hPullY_Smt_Width"));
TH1D* fhtmpWZ = (TH1D*) gDirectory->FindObjectAny(Form("hPullZ_Smt_Width"));
gROOT->cd();
if (NULL == fhtmp) {
LOG(info) << Form("CbmTofFindTracks::LoadCalParameter: hPullT_Smt_Off")
<< " not found. ";
} else {
fhPullT_Smt_Off = (TH1D*) fhtmp->Clone();
}
if (NULL == fhtmpX) {
LOG(info) << Form("CbmTofFindTracks::LoadCalParameter: hPullX_Smt_Off")
<< " not found. ";
} else {
fhPullX_Smt_Off = (TH1D*) fhtmpX->Clone();
}
if (NULL == fhtmpY) {
LOG(info) << Form("CbmTofFindTracks::LoadCalParameter: hPullY_Smt_Off")
<< " not found. ";
} else {
fhPullY_Smt_Off = (TH1D*) fhtmpY->Clone();
}
if (NULL == fhtmpZ) {
LOG(info) << Form("CbmTofFindTracks::LoadCalParameter: hPullZ_Smt_Off")
<< " not found. ";
} else {
fhPullZ_Smt_Off = (TH1D*) fhtmpZ->Clone();
}
if (NULL == fhtmpW) {
LOG(info) << Form("CbmTofFindTracks::LoadCalParameter: hPullT_Smt_Width")
<< " not found. ";
} else {
if (fbUseSigCalib) fhPullT_Smt_Width = (TH1D*) fhtmpW->Clone();
}
if (NULL == fhtmpWX) {
LOG(info) << Form("CbmTofFindTracks::LoadCalParameter: hPullX_Smt_Width")
<< " not found. ";
} else {
if (fbUseSigCalib) fhPullX_Smt_Width = (TH1D*) fhtmpWX->Clone();
}
if (NULL == fhtmpWY) {
LOG(info) << Form("CbmTofFindTracks::LoadCalParameter: hPullY_Smt_Width")
<< " not found. ";
} else {
if (fbUseSigCalib) fhPullY_Smt_Width = (TH1D*) fhtmpWY->Clone();
}
if (NULL == fhtmpWZ) {
LOG(info) << Form("CbmTofFindTracks::LoadCalParameter: hPullZ_Smt_Width")
<< " not found. ";
} else {
if (fbUseSigCalib) fhPullZ_Smt_Width = (TH1D*) fhtmpWZ->Clone();
}
fCalParFile->Close();
Double_t nSmt = fMapRpcIdParInd.size();
if (NULL == fhPullT_Smt_Off) { // provide default TOffset histogram
fhPullT_Smt_Off =
new TH1F(Form("hPullT_Smt_Off"),
Form("Tracklet PullT vs RpcInd ; RpcInd ; #DeltaT (ns)"),
nSmt,
0,
nSmt);
// Initialize Parameter
if (fiCorMode == 3) // hidden option, FIXME
for (Int_t iDet = 0; iDet < nSmt; iDet++) {
std::map<Int_t, Int_t>::iterator it;
//it = fMapRpcIdParInd.find(iDet);
for (it = fMapRpcIdParInd.begin(); it != fMapRpcIdParInd.end(); it++) {
if (it->second == iDet) break;
}
LOG(debug1) << Form(" iDet %d -> iUniqueId ? 0x%08x, 0x%08x ",
iDet,
it->first,
it->second);
Int_t iUniqueId = it->first;
CbmTofCell* fChannelInfo = fDigiPar->GetCell(iUniqueId);
if (NULL != fChannelInfo) {
Double_t dVal =
0.; // FIXME numeric constant in code, default for cosmic
if (fiBeamCounter != iUniqueId)
dVal =
fChannelInfo->GetZ() * fTtTarg; // use calibration target value
fhPullT_Smt_Off->SetBinContent(iDet + 1, dVal);
LOG(info) << Form("Initialize det 0x%08x at %d, z=%f with TOff %6.2f",
iUniqueId,
iDet + 1,
fChannelInfo->GetZ(),
dVal);
}
}
}
if (NULL == fhPullT_Smt_Width) { // provide default TWidth histogram
fhPullT_Smt_Width =
new TH1F(Form("hPullT_Smt_Width"),
Form("Tracklet ResiT Width vs RpcInd ; RpcInd ; RMS(T) (ns)"),
nSmt,
0,
nSmt);
// Initialize Parameter
for (Int_t iDet = 0; iDet < nSmt; iDet++) {
fhPullT_Smt_Width->SetBinContent(iDet + 1, fSIGT);
}
}
LOG(info) << "CbmTofFindTracks::LoadCalParameter: fhPullT_Smt_Off at "
<< fhPullT_Smt_Off;
if (NULL == fhPullX_Smt_Off) // provide default XOffset histogram
fhPullX_Smt_Off =
new TH1F(Form("hPullX_Smt_Off"),
Form("Tracklet ResiX vs RpcInd ; RpcInd ; #DeltaX (cm)"),
nSmt,
0,
nSmt);
if (NULL == fhPullX_Smt_Width) {
fhPullX_Smt_Width =
new TH1F(Form("hPullX_Smt_Width"),
Form("Tracklet ResiX Width vs RpcInd ; RpcInd ; RMS(X) (cm)"),
nSmt,
0,
nSmt);
// Initialize Parameter
for (Int_t iDet = 0; iDet < nSmt; iDet++) {
fhPullX_Smt_Width->SetBinContent(iDet + 1, fSIGX);
}
}
if (NULL == fhPullY_Smt_Off) // provide default YOffset histogram
fhPullY_Smt_Off =
new TH1F(Form("hPullY_Smt_Off"),
Form("Tracklet ResiY vs RpcInd ; RpcInd ; #DeltaY (cm)"),
nSmt,
0,
nSmt);
if (NULL == fhPullY_Smt_Width) {
fhPullY_Smt_Width =
new TH1F(Form("hPullY_Smt_Width"),
Form("Tracklet ResiY Width vs RpcInd ; RpcInd ; RMS(Y) (cm)"),
nSmt,
0,
nSmt);
// Initialize Parameter
for (Int_t iDet = 0; iDet < nSmt; iDet++) {
fhPullY_Smt_Width->SetBinContent(iDet + 1, fSIGY);
}
}
if (NULL == fhPullZ_Smt_Off) // provide default TOffset histogram
fhPullZ_Smt_Off =
new TH1F(Form("hPullZ_Smt_Off"),
Form("Tracklet ResiZ vs RpcInd ; RpcInd ; #DeltaZ (cm)"),
nSmt,
0,
nSmt);
if (NULL == fhPullZ_Smt_Width) {
fhPullZ_Smt_Width =
new TH1F(Form("hPullZ_Smt_Width"),
Form("Tracklet ResiZ Width vs RpcInd ; RpcInd ; RMS(Z) (cm)"),
nSmt,
0,
nSmt);
// Initialize Parameter
for (Int_t iDet = 0; iDet < nSmt; iDet++) {
fhPullZ_Smt_Width->SetBinContent(iDet + 1, fSIGZ);
}
}
return kTRUE;
}
//-------------------------------------------------------------------------------------------------
Bool_t CbmTofFindTracks::InitParameters() {
// Initialize the TOF GeoHandler
Bool_t isSimulation = kFALSE;
Int_t iGeoVersion = fGeoHandler->Init(isSimulation);
if (k12b > iGeoVersion) {
LOG(error) << "CbmTofFindTracks::InitParameters => Only compatible with "
"geometries after v12b !!!";
return kFALSE;
}
LOG(info) << "CbmTofFindTracks::InitParameters: GeoVersion " << iGeoVersion;
switch (iGeoVersion) {
case k12b: fTofId = new CbmTofDetectorId_v12b(); break;
case k14a: fTofId = new CbmTofDetectorId_v14a(); break;
case k21a: fTofId = new CbmTofDetectorId_v21a(); break;
default:
LOG(fatal) << "CbmTofFindTracks::InitParameters: Invalid Detector ID "
<< iGeoVersion;
}
// create digitization parameters from geometry file
CbmTofCreateDigiPar* tofDigiPar =
new CbmTofCreateDigiPar("TOF Digi Producer", "TOF task");
LOG(info) << "Create DigiPar ";
tofDigiPar->Init();
return kTRUE;
}
// ----- SetParContainers -------------------------------------------------
void CbmTofFindTracks::SetParContainers() {
FairRunAna* ana = FairRunAna::Instance();
FairRuntimeDb* rtdb = ana->GetRuntimeDb();
// rtdb->getContainer("CbmGeoPassivePar");
// rtdb->getContainer("CbmGeoStsPar");
// rtdb->getContainer("CbmGeoTofPar");
rtdb->getContainer("FairBaseParSet");
// rtdb->getContainer("CbmGeoPassivePar");
// rtdb->getContainer("CbmGeoStsPar");
// rtdb->getContainer("CbmGeoRichPar");
rtdb->getContainer("CbmGeoTofPar");
// rtdb->getContainer("CbmFieldPar");
fDigiPar = (CbmTofDigiPar*) (rtdb->getContainer("CbmTofDigiPar"));
LOG(info) << " CbmTofFindTracks::SetParContainers found "
<< fDigiPar->GetNrOfModules() << " cells ";
fDigiBdfPar = (CbmTofDigiBdfPar*) (rtdb->getContainer("CbmTofDigiBdfPar"));
}
// -------------------------------------------------------------------------
Bool_t CbmTofFindTracks::WriteHistos() {
if (fiCorMode < 0) return kTRUE;
LOG(info) << Form("CbmTofFindTracks::WriteHistos: %s, mode = %d",
fCalOutFileName.Data(),
fiCorMode);
// Write histogramms to the file
TDirectory* oldir = gDirectory;
TFile* fHist = new TFile(fCalOutFileName, "RECREATE");
fHist->cd();
const Double_t RMSmin = 0.03; // in ns
switch (fiCorMode) {
case 0: {
TProfile* htmp = fhPullT_Smt->ProfileX();
TH1D* htmp1D = htmp->ProjectionX();
TProfile* hTOff = fhTOff_HMul2->ProfileX();
TH1D* hTOff1D = hTOff->ProjectionX();
Double_t nx = htmp1D->GetNbinsX();
for (Int_t ix = 1; ix < nx; ix++) {
Double_t dVal = 0;
if (fhPullT_Smt_Off != NULL) {
dVal = fhPullT_Smt_Off->GetBinContent(ix + 1);
} else {
fhPullT_Smt_Off = htmp1D;
}
TH1D* hTOff1DY =
fhTOff_HMul2->ProjectionY(Form("_py%d", ix), ix + 1, ix + 1, "");
Double_t dFMean = 0.;
if (hTOff1DY->GetEntries() > 100) {
//Double_t dMean=hTOff1DY->GetMean();
Int_t iBmax = hTOff1DY->GetMaximumBin();
TAxis* xaxis = hTOff1DY->GetXaxis();
Double_t dMean =
xaxis->GetBinCenter(iBmax); //X-value of bin with maximal content
Double_t dLim = 1000.; //1.5*hTOff1DY->GetRMS();
TFitResultPtr fRes =
hTOff1DY->Fit("gaus", "S", "", dMean - dLim, dMean + dLim);
dFMean = fRes->Parameter(1);
}
dVal -= dFMean;
LOG(info) << "Init TOff " << ix << ": Old "
<< fhPullT_Smt_Off->GetBinContent(ix + 1) << ", Cnts "
<< hTOff1D->GetBinContent(ix + 1) << ", FitMean " << dFMean
<< " -> " << dVal;
fhPullT_Smt_Off->SetBinContent(ix + 1, dVal);
}
}
break;
case 1: // correct mean deviation from fit (Pull)
{
TProfile* htmp = fhPullT_Smt->ProfileX();
TH1D* htmp1D = htmp->ProjectionX();
TProfile* hTOff = fhTOff_Smt->ProfileX();
TH1D* hTOff1D = hTOff->ProjectionX();
if (fhPullT_Smt_Off != NULL) {
Double_t nx = htmp1D->GetNbinsX();
for (Int_t ix = 0; ix < nx; ix++) {
Double_t dVal = fhPullT_Smt_Off->GetBinContent(ix + 1);
dVal -= htmp1D->GetBinContent(ix + 1);
LOG(debug1) << "Update hPullT_Smt_Off " << ix << ": "
<< fhPullT_Smt_Off->GetBinContent(ix + 1) << " + "
<< htmp1D->GetBinContent(ix + 1) << " + "
<< hTOff1D->GetBinContent(ix + 1) << " -> " << dVal;
fhPullT_Smt_Off->SetBinContent(ix + 1, dVal);
}
} else {
LOG(warning)
<< "CbmTofFindTracks::WriteHistos: fhPullT_Smt_Off not found ";
}
}
break;
case 2: // correct deviation from DeltaTt=0 expectation
{
TProfile* htmp = fhPullT_Smt->ProfileX();
TH1D* htmp1D = htmp->ProjectionX();
TProfile* hTOff = fhTOff_Smt->ProfileX();
TH1D* hTOff1D = hTOff->ProjectionX();
if (fhPullT_Smt_Off != NULL) {
Double_t nx = htmp1D->GetNbinsX();
for (Int_t ix = 0; ix < nx; ix++) {
Double_t dVal = fhPullT_Smt_Off->GetBinContent(ix + 1);
dVal -= hTOff1D->GetBinContent(ix + 1);
TH1D* hTOff1DY =
fhTOff_Smt->ProjectionY(Form("_py%d", ix), ix + 1, ix + 1, "");
Double_t dFMean = 0.;
if (hTOff1DY->GetEntries() > 100) {
//Double_t dMean=hTOff1DY->GetMean();
Int_t iBmax = hTOff1DY->GetMaximumBin();
TAxis* xaxis = hTOff1DY->GetXaxis();
Double_t dMean =
xaxis->GetBinCenter(iBmax); //X-value of bin with maximal content
Double_t dLim = 1.5 * hTOff1DY->GetRMS();
TFitResultPtr fRes =
hTOff1DY->Fit("gaus", "S", "", dMean - dLim, dMean + dLim);
Int_t iFitStatus = fRes;
if (iFitStatus == 0) { // check validity of fit
dFMean = fRes->Parameter(1);
dVal +=
hTOff1D->GetBinContent(ix + 1); //revert default correction
dVal -= dFMean;
}
LOG(info) << "Update hPullT_Smt_Off Ind " << ix << ": Old "
<< fhPullT_Smt_Off->GetBinContent(ix + 1) << ", Pull "
<< htmp1D->GetBinContent(ix + 1) << ", Dev@Peak "
<< hTOff1D->GetBinContent(ix + 1) << ", FitMean "
<< dFMean << " -> " << dVal;
} else {
LOG(debug1) << "Update hPullT_Smt_Off " << ix
<< ": insufficient counts: " << hTOff1DY->GetEntries();
}
fhPullT_Smt_Off->SetBinContent(ix + 1, dVal);
}
} else {
LOG(warning)
<< "CbmTofFindTracks::WriteHistos: fhPullT_Smt_Off not found ";
}
} break;
case 3: // correct Time Offset from PullT, extract width
{
TProfile* htmp = fhPullT_Smt->ProfileX();
TH1D* htmp1D = htmp->ProjectionX();
if (fhPullT_Smt_Off != NULL) {
Double_t nx = htmp1D->GetNbinsX();
for (Int_t ix = 0; ix < nx; ix++) {
TH1D* hpy = fhPullT_Smt->ProjectionY("_py", ix + 1, ix + 1);
if (hpy->GetEntries() > 100.) {
Int_t iBmax = hpy->GetMaximumBin();
TAxis* xaxis = hpy->GetXaxis();
Double_t dMean =
xaxis->GetBinCenter(iBmax); //X-value of bin with maximal content
Double_t dRMS = TMath::Abs(hpy->GetRMS());
Double_t dLim = 1.5 * dRMS;
TFitResultPtr fRes =
hpy->Fit("gaus", "S", "", dMean - dLim, dMean + dLim);
Double_t dFMean = fRes->Parameter(1);
Double_t dVal = fhPullT_Smt_Off->GetBinContent(ix + 1);
dVal -= dFMean;
TF1* fg = hpy->GetFunction("gaus");
Double_t dFMeanError = fg->GetParError(1);
LOG(info) << "Update hPullT_Smt_Off3 Ind " << ix << ": "
<< fhPullT_Smt_Off->GetBinContent(ix + 1) << " + "
<< dFMean << ", Err " << dFMeanError << " -> " << dVal
<< ", Width " << dRMS << ", Chi2 " << fg->GetChisquare();
if (dFMeanError < 0.05) { // FIXME: hardwired constant
if (dRMS < RMSmin) dRMS = RMSmin;
if (dRMS > fSIGT * 3.0) dRMS = fSIGT * 3.;
if (fRpcAddr[ix]
!= fiBeamCounter) // don't correct beam counter position
fhPullT_Smt_Off->SetBinContent(ix + 1, dVal);
fhPullT_Smt_Width->SetBinContent(ix + 1, dRMS);
}
} else {
LOG(debug1) << "Update hPullT_Smt_Off " << ix
<< ": insufficient counts: " << hpy->GetEntries();
}
}
} else {
LOG(warning)
<< "CbmTofFindTracks::WriteHistos: fhPullT_Smt_Off not found ";
}
}
break;
case 4: // correct mean deviation from fit (Pull), extract width for x direction
{
TProfile* htmp = fhPullX_Smt->ProfileX();
TH1D* htmp1D = htmp->ProjectionX();
if (fhPullX_Smt_Off != NULL) {
Double_t nx = htmp1D->GetNbinsX();
for (Int_t ix = 0; ix < nx; ix++) {
TH1D* hpy = fhPullX_Smt->ProjectionY("_py", ix + 1, ix + 1);
Double_t dVal = fhPullX_Smt_Off->GetBinContent(ix + 1);
//dVal -= htmp1D->GetBinContent(ix + 1);
if (hpy->GetEntries() > 100.) {
Double_t dRMS = TMath::Abs(hpy->GetRMS());
/* not found by linker
Int_t maxPeaks=1;
auto *s=new TSpectrum(maxPeaks);
Int_t nPeaks=s->Search(hpy,dRMS,"new");
if (nPeaks==1) {
*/
if(kTRUE) {
//Double_t *xPeaks=s->GetPositionX();
//LOG(info) << "Found peak at" << xPeaks[0];
// Fit gaussian
//Double_t dFMean = xPeaks[0];
Double_t dFMean=hpy->GetBinCenter( hpy-> GetMaximumBin() );
Double_t dFLim = 0.5; // CAUTION, fixed numeric value
Double_t dBinSize = hpy->GetBinWidth(1);
dFLim=TMath::Max(dFLim,5.*dBinSize);
TFitResultPtr fRes =
hpy->Fit("gaus", "S", "", dFMean - dFLim, dFMean + dFLim);
dVal -= fRes->Parameter(1);
dRMS = fRes->Parameter(2);
LOG(info)<<"PeakFit at " << dFMean << ", lim " << dFLim
<<" : mean " << fRes->Parameter(1) << ", width " << dRMS;
}
if (dRMS < fSIGX * 0.5) dRMS = fSIGX * 0.5;
if (dRMS > fSIGX * 3.0) dRMS = fSIGX * 3.;
// limit maximal shift in X, for larger values, change geometry file
if (dVal < -3.) dVal = -3.;
if (dVal > 3.) dVal = 3.;
//if( fRpcAddr[ix] != fiBeamCounter ) // don't correct beam counter position
LOG(info) << "Update hPullX_Smt_Off " << ix << ": "
<< fhPullX_Smt_Off->GetBinContent(ix + 1) << " + "
<< htmp1D->GetBinContent(ix + 1) << " -> " << dVal
<< ", Width " << dRMS;
fhPullX_Smt_Off->SetBinContent(ix + 1, dVal);
fhPullX_Smt_Width->SetBinContent(ix + 1, dRMS);
}
}
} else {
LOG(warning)
<< "CbmTofFindTracks::WriteHistos: fhPullX_Smt_Off not found ";
}
}
break;
case 5: // correct mean deviation from fit (Pull), extract width for Y direction
{
TProfile* htmp = fhPullY_Smt->ProfileX();
TH1D* htmp1D = htmp->ProjectionX();
if (fhPullY_Smt_Off != NULL) {
Double_t nx = htmp1D->GetNbinsX();
for (Int_t ix = 0; ix < nx; ix++) {
Double_t dVal = fhPullY_Smt_Off->GetBinContent(ix + 1);
dVal -= htmp1D->GetBinContent(ix + 1);
//if( fRpcAddr[ix] != fiBeamCounter ) // don't correct beam counter position
fhPullY_Smt_Off->SetBinContent(ix + 1, dVal);
TH1D* hpy = fhPullY_Smt->ProjectionY("_py", ix + 1, ix + 1);
if (hpy->GetEntries() > 100.) {
Double_t dRMS = TMath::Abs(hpy->GetRMS());
if (dRMS < fSIGY * 0.5) dRMS = 0.5 * fSIGY;
if (dRMS > fSIGY * 3.0) dRMS = fSIGY * 3.;
fhPullY_Smt_Width->SetBinContent(ix + 1, dRMS);
LOG(debug1) << "Update hPullY_Smt_Off " << ix << ": "
<< fhPullY_Smt_Off->GetBinContent(ix + 1) << " + "
<< htmp1D->GetBinContent(ix + 1) << " -> " << dVal
<< ", Width " << dRMS;
}
}
} else {
LOG(warning)
<< "CbmTofFindTracks::WriteHistos: fhPullY_Smt_Off not found ";
}
}
break;
case 6: // correct mean deviation from fit (Pull), extract width
{
TProfile* htmp = fhPullZ_Smt->ProfileX();
TH1D* htmp1D = htmp->ProjectionX();
if (fhPullZ_Smt_Off != NULL) {
Double_t nx = htmp1D->GetNbinsX();
for (Int_t ix = 0; ix < nx; ix++) {
Double_t dVal = fhPullZ_Smt_Off->GetBinContent(ix + 1);
dVal -= htmp1D->GetBinContent(ix + 1);
fhPullZ_Smt_Off->SetBinContent(ix + 1, dVal);
TH1D* hpy = fhPullZ_Smt->ProjectionY("_py", ix + 1, ix + 1);
if (hpy->GetEntries() > 100.) {
Double_t dRMS = TMath::Abs(hpy->GetRMS());
LOG(debug1) << "Update hPullZ_Smt_Off " << ix << ": "
<< fhPullZ_Smt_Off->GetBinContent(ix + 1) << " + "
<< htmp1D->GetBinContent(ix + 1) << " -> " << dVal
<< ", Width " << dRMS;
if (dRMS < 1.5) dRMS = 1.5;
fhPullZ_Smt_Width->SetBinContent(ix + 1, dRMS);
}
}
} else {
LOG(warning)
<< "CbmTofFindTracks::WriteHistos: fhPullZ_Smt_Off not found ";
}
} break;
case 7: // extract residual widthes in T, X, Y, Z
{
for (Int_t iStation = 0;
iStation < static_cast<Int_t>(fMapRpcIdParInd.size());
iStation++) {
TH1D* hResidualT =
fhPullT_Smt->ProjectionY("_py", iStation + 1, iStation + 1);
TH1D* hResidualX =
fhPullX_Smt->ProjectionY("_py", iStation + 1, iStation + 1);
TH1D* hResidualY =
fhPullY_Smt->ProjectionY("_py", iStation + 1, iStation + 1);
TH1D* hResidualZ =
fhPullZ_Smt->ProjectionY("_py", iStation + 1, iStation + 1);
if (hResidualT->GetEntries() > 100.) {
Double_t dRMS = TMath::Abs(hResidualT->GetRMS());
if (dRMS < RMSmin) dRMS = RMSmin;
if (dRMS > 3. * fSIGT) dRMS = 3. * fSIGT;
fhPullT_Smt_Width->SetBinContent(iStation + 1, dRMS);
}
if (hResidualX->GetEntries() > 100.) {
Double_t dRMS = TMath::Abs(hResidualX->GetRMS());
if (dRMS < 0.5 * fSIGX) dRMS = 0.5 * fSIGX;
if (dRMS > 3. * fSIGX) dRMS = 3. * fSIGX;
fhPullX_Smt_Width->SetBinContent(iStation + 1, dRMS);
}
if (hResidualY->GetEntries() > 100.) {
Double_t dRMS = TMath::Abs(hResidualY->GetRMS());
if (dRMS < 0.5 * fSIGY) dRMS = 0.5 * fSIGY;
if (dRMS > 3. * fSIGY) dRMS = 3. * fSIGY;
fhPullY_Smt_Width->SetBinContent(iStation + 1, dRMS);
}
if (hResidualZ->GetEntries() > 100.) {
Double_t dRMS = TMath::Abs(hResidualZ->GetRMS());
if (dRMS < 1.5) dRMS = 1.5;
fhPullZ_Smt_Width->SetBinContent(iStation + 1, dRMS);
}
}
} break;
case 10: //correct mean deviation from TB - histo of station 0
case 11:
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
case 19: {
Int_t iSt = fiCorMode % 10;
TString hname = Form("hPull%s_Station_%d", "TB", iSt);
TH1* h1 = (TH1*) gROOT->FindObjectAny(hname);
if (h1->GetEntries() > 100) {
Double_t dFMean = h1->GetMean();
Double_t dFLim = 2.5 * h1->GetRMS();
TFitResultPtr fRes =
h1->Fit("gaus", "S", "", dFMean - dFLim, dFMean + dFLim);
Double_t dDOff = fRes->Parameter(1);
Double_t dSig = fRes->Parameter(2);
Int_t iRpcInd = fMapRpcIdParInd[fMapStationRpcId[iSt]];
Double_t dVal = fhPullT_Smt_Off->GetBinContent(iRpcInd + 1);
dVal -= dDOff;
LOG(info) << "Update hPullT_Smt_OffP Ind " << iSt << ", Ind " << iRpcInd
<< ": " << fhPullT_Smt_Off->GetBinContent(iRpcInd + 1)
<< " - " << dDOff << " -> " << dVal << ", Width " << dSig;
fhPullT_Smt_Off->SetBinContent(iRpcInd + 1, dVal);
if (dSig < fSIGT * 0.5) dSig = 0.5 * fSIGT;
if (dSig > fSIGT * 3.0) dSig = fSIGT * 3.;
fhPullT_Smt_Width->SetBinContent(iRpcInd + 1, dSig);
} else {
LOG(info) << "CbmTofFindTracks::WriteHistos: Too few entries in histo "
<< hname;
}
} break;
default:;
}
if (NULL != fhPullT_Smt_Off) {
// always extract residual widthes in T, X, Y, Z
for (Int_t iStation = 0;
iStation < static_cast<Int_t>(fMapRpcIdParInd.size());
iStation++) {
TH1D* hResidualT =
fhPullT_Smt->ProjectionY("_py", iStation + 1, iStation + 1);
TH1D* hResidualX =
fhPullX_Smt->ProjectionY("_py", iStation + 1, iStation + 1);
TH1D* hResidualY =
fhPullY_Smt->ProjectionY("_py", iStation + 1, iStation + 1);
TH1D* hResidualZ =
fhPullZ_Smt->ProjectionY("_py", iStation + 1, iStation + 1);
if (hResidualT->GetEntries() > 100.) {
Double_t dRMS = TMath::Abs(hResidualT->GetRMS());
if (dRMS < RMSmin) dRMS = RMSmin;
if (dRMS > 3. * fSIGT) dRMS = 3. * fSIGT;
fhPullT_Smt_Width->SetBinContent(iStation + 1, dRMS);
}
if (hResidualX->GetEntries() > 100.) {
Double_t dRMS = TMath::Abs(hResidualX->GetRMS());
if (dRMS < 0.5 * fSIGX) dRMS = 0.5 * fSIGX;
if (dRMS > 3. * fSIGX) dRMS = 3. * fSIGX;
fhPullX_Smt_Width->SetBinContent(iStation + 1, dRMS);
}
if (hResidualY->GetEntries() > 100.) {
Double_t dRMS = TMath::Abs(hResidualY->GetRMS());
if (dRMS < 0.5 * fSIGY) dRMS = 0.5 * fSIGY;
if (dRMS > 3. * fSIGY) dRMS = 3. * fSIGY;
fhPullY_Smt_Width->SetBinContent(iStation + 1, dRMS);
}
if (hResidualZ->GetEntries() > 100.) {
Double_t dRMS = TMath::Abs(hResidualZ->GetRMS());
if (dRMS < 0.1) dRMS = 0.1;
if (dRMS > 1.0) dRMS = 1.;
fhPullZ_Smt_Width->SetBinContent(iStation + 1, dRMS);
}
}
fhPullT_Smt_Off->Write();
fhPullX_Smt_Off->Write();
fhPullY_Smt_Off->Write();
fhPullZ_Smt_Off->Write();
fhPullT_Smt_Width->Write();
fhPullX_Smt_Width->Write();
fhPullY_Smt_Width->Write();
fhPullZ_Smt_Width->Write();
}
gDirectory->cd(oldir->GetPath());
fHist->Close();
return kTRUE;
}
// ----- Public method Exec --------------------------------------------
void CbmTofFindTracks::Exec(Option_t* opt) {
if (!fEventsColl) {
// fTofHitArray = (TClonesArray*)fTofHitArrayIn->Clone();
fTofHitArray = (TClonesArray*) fTofHitArrayIn;
ExecFind(opt);
} else {
Int_t iNbTrks = 0;
fTrackArrayOut->Delete(); //Clear("C");
for (Int_t iEvent = 0; iEvent < fEventsColl->GetEntriesFast(); iEvent++) {
CbmEvent* tEvent = dynamic_cast<CbmEvent*>(fEventsColl->At(iEvent));
LOG(debug) << "Process event " << iEvent << " with "
<< tEvent->GetNofData(ECbmDataType::kTofHit) << " hits";
if (fTofHitArray) fTofHitArray->Clear("C");
Int_t iNbHits = 0;
for (Int_t iHit = 0; iHit < tEvent->GetNofData(ECbmDataType::kTofHit);
iHit++) {
Int_t iHitIndex =
static_cast<Int_t>(tEvent->GetIndex(ECbmDataType::kTofHit, iHit));
CbmTofHit* tHit =
dynamic_cast<CbmTofHit*>(fTofHitArrayIn->At(iHitIndex));
new ((*fTofHitArray)[iNbHits++]) CbmTofHit(*tHit);
}
ExecFind(opt);
// --- In event-by-event mode: copy tracks to output array and register them to event
for (Int_t iTrk = 0; iTrk < fTrackArray->GetEntries(); iTrk++) {
CbmTofTracklet* pTrk = (CbmTofTracklet*) fTrackArray->At(iTrk);
new ((*fTrackArrayOut)[iNbTrks]) CbmTofTracklet(*pTrk);
tEvent->AddData(ECbmDataType::kTofTrack, iNbTrks);
iNbTrks++;
}
fTrackArray->Delete();
}
}
}
void CbmTofFindTracks::ExecFind(Option_t* /*opt*/) {
fiEvent++;
ResetStationsFired();
if (NULL != fTofUHitArray) fTofUHitArray->Clear("C");
if (NULL != fTrackArray) fTrackArray->Delete(); // reset
// recalibrate hits and count trackable hits
for (Int_t iHit = 0; iHit < fTofHitArray->GetEntries(); iHit++) {
CbmTofHit* pHit = (CbmTofHit*) fTofHitArray->At(iHit);
Int_t iDetId = (pHit->GetAddress() & DetMask);
Double_t dSIGX = GetSigX(iDetId);
if (dSIGX == 0.) dSIGX = fSIGX;
Double_t dSIGY = GetSigY(iDetId);
if (dSIGY == 0.) dSIGY = fSIGY;
Double_t dSIGZ = GetSigZ(iDetId);
if (dSIGZ == 0.) dSIGZ = fSIGZ;
TVector3 hitPosErr(dSIGX, dSIGY, dSIGZ); // include positioning uncertainty
pHit->SetPositionError(hitPosErr);
Double_t dSIGT = GetSigT(iDetId);
if (dSIGT == 0.) dSIGT = fSIGT;
pHit->SetTimeError(dSIGT);
if (fiBeamCounter > -1) {
// set diamond positions to (0,0,0) to allow inclusion in straight line fit
if ((iDetId & 0x0000F00F) == 0x00005006) // modify diamond position
{
if (0. != fdBeamMomentumLab) {
Double_t dTargetTimeOffset =
pHit->GetZ() / fdBeamMomentumLab
* TMath::Sqrt(TMath::Power(fdBeamMomentumLab, 2.)
+ TMath::Power(0.938271998, 2.))
/ TMath::Ccgs() * 1.0e09;
pHit->SetTime(pHit->GetTime() - dTargetTimeOffset);
}
TVector3 hitPos(0., 0., 0.);
// TVector3 hitPos(pHit->GetX(), pHit->GetY(), 0.);
// TVector3 hitPosErr(1.,1.,5.0); // including positioning uncertainty
pHit->SetPosition(hitPos);
TVector3 hitPosErr0(1., 1., 1.); // including positioning uncertainty
pHit->SetPositionError(hitPosErr0); //
}
}
if (fbRemoveSignalPropagationTime) {
Int_t iHitAddress = pHit->GetAddress();
Int_t iModuleType = CbmTofAddress::GetSmType(iHitAddress);
Int_t iModuleIndex = CbmTofAddress::GetSmId(iHitAddress);
Int_t iCounterIndex = CbmTofAddress::GetRpcId(iHitAddress);
CbmTofCell* fChannelInfo = fDigiPar->GetCell(iHitAddress);
Double_t dSignalPropagationTime =
0.5
* (fChannelInfo->GetSizey() >= fChannelInfo->GetSizex()
? fChannelInfo->GetSizey()
: fChannelInfo->GetSizex())
/ fDigiBdfPar->GetSigVel(iModuleType, iModuleIndex, iCounterIndex);
pHit->SetTime(pHit->GetTime() - dSignalPropagationTime);
}
// tune positions and times
Double_t dTcor = 0.;
if ((iDetId & 0x0000F00F)
!= 0x00005006) { // do not modify diamond position
Int_t iRpcInd = fMapRpcIdParInd[iDetId];
if (fhPullT_Smt_Off != NULL) {
dTcor = (Double_t) fhPullT_Smt_Off->GetBinContent(iRpcInd + 1);
pHit->SetTime(pHit->GetTime() + dTcor);
}
if (fhPullX_Smt_Off != NULL) {
Double_t dXcor = (Double_t) fhPullX_Smt_Off->GetBinContent(iRpcInd + 1);
pHit->SetX(pHit->GetX() + dXcor);
}
if (fhPullY_Smt_Off != NULL) {
Double_t dYcor = (Double_t) fhPullY_Smt_Off->GetBinContent(iRpcInd + 1);
pHit->SetY(pHit->GetY() + dYcor);
}
if (fhPullZ_Smt_Off != NULL) {
Double_t dZcor = (Double_t) fhPullZ_Smt_Off->GetBinContent(iRpcInd + 1);
pHit->SetZ(pHit->GetZ() + dZcor);
}
}
Int_t iSt = GetStationOfAddr(iDetId);
MarkStationFired(iSt);
LOG(debug) << Form(
"Exec found Hit %02d, addr 0x%08x, sta %02d, HM %02d, X %6.2f(%3.2f) Y "
"%6.2f(%3.2f) Z %6.2f(%3.2f) T %6.2f(%3.2f) (%6.2f)",
iHit,
pHit->GetAddress(),
GetStationOfAddr(iDetId),
fStationHMul[GetStationOfAddr(iDetId)],
pHit->GetX(),
pHit->GetDx(),
pHit->GetY(),
pHit->GetDy(),
pHit->GetZ(),
pHit->GetDz(),
pHit->GetTime(),
pHit->GetTimeError(),
dTcor);
}
LOG(debug) << Form("CbmTofFindTracks::Exec NStationsFired %d > %d Min ?",
GetNStationsFired(),
GetMinNofHits());
if (GetNStationsFired() < GetMinNofHits()) {
fInspectEvent = kFALSE; // mark event as non trackable
} else
fInspectEvent = kTRUE;
CheckMaxHMul();
// resort Hit array with respect to time, FIXME danger: links to digis become invalid (???, check!!!)
// fTofHitArray->Sort(fTofHitArray->GetEntries()); // feature not available
if (fInspectEvent && fNTofStations > 1) {
fStart.Set();
//fTrackArray->Clear("C+C");
fNofTracks = fFinder->DoFind(fTofHitArray, fTrackArray);
// fTrackArray->Compress();
fStop.Set();
fdTrackingTime = fStop.GetSec() - fStart.GetSec()
+ (fStop.GetNanoSec() - fStart.GetNanoSec()) / 1e9;
LOG(debug) << Form("CbmTofFindTracks::Exec found %d Tracklets in %f sec",
fTrackArray->GetEntriesFast(),
fdTrackingTime);
FindVertex();
FillHistograms();
}
FillUHits(); // put unused hits into TClonesArray
}
// -------------------------------------------------------------------------
// ----- Public method Finish ------------------------------------------
void CbmTofFindTracks::Finish() {
if (fiEvent < 1000) return; // preserve calibration histos in event display
if (fiCalOpt > 0) fTofCalibrator->UpdateCalHist(fiCalOpt);
WriteHistos();
LOG(info) << Form(" CbmTofFindTracks::Finished ");
}
// -------------------------------------------------------------------------
void CbmTofFindTracks::CreateHistograms() {
TDirectory* oldir =
gDirectory; // <= To prevent histos from being sucked in by the param file of the TRootManager!
gROOT
->cd(); // <= To prevent histos from being sucked in by the param file of the TRootManager !
// define histos here
Double_t nSmt = fMapRpcIdParInd.size();
LOG(info) << Form(
" CbmTofFindTracks::CreateHistograms for %d counters, %d stations ",
(Int_t) nSmt,
fNTofStations);
fhTrklMul = new TH1F(
Form("hTrklMul"), Form("Tracklet Multiplicity; MulTracklet"), 100, 0, 100);
fhAllHitsStation = new TH1F(Form("hAllHitsStation"),
Form("Reconstructed Hits; Station #"),
fNTofStations,
0,
fNTofStations);
fhAllHitsSmTypes = new TH1F(
Form("hAllHitsSmTypes"), Form("Reconstructed Hits; SmType #"), 10, 0, 10);
fhUsedHitsStation =
new TH1F(Form("hUsedHitsStation"),
Form("Used (HMul>2) / Reconstructed Hits; Station #"),
fNTofStations,
0,
fNTofStations);
fhTrklChi2 = new TH2F(Form("hTrklChi2"),
Form("Tracklet Chi; HMul_{Tracklet}; #chi"),
8,
2,
10,
100,
0,
((CbmTofTrackFinderNN*) fFinder)->GetChiMaxAccept());
fhTrackingTimeNhits = new TH2F(Form("hTrackingTimeNhits"),
Form("Tracking Time; NHits; #Deltat (s)"),
100,
0,
200,
50,
0,
0.1);
fhTrklMulNhits = new TH2F(Form("hTrklMulNhits"),
Form("Tracklet Multiplicity; NHits; NTracklet"),
150,
0,
150,
25,
0,
25);
fhTrklMulMaxMM = new TH2F(Form("hTrklMulMaxMax-1"),
Form("Tracklet Multiplicity; TMulMax; TMulMax-1"),
10,
0,
10,
10,
0,
10);
fhTrklMul3D = new TH3F(Form("hTrklMul3D"),
Form("Tracklet Multiplicities; TMul3; TMul4; TMul5"),
10,
0,
10,
10,
0,
10,
10,
0,
10);
fhTrklHMul =
new TH2F(Form("hTrklHMul"),
Form("Tracklet Hit - Multiplicity; HMul_{Tracklet}; Mul_{HMul}"),
8,
2,
10,
20,
0,
20);
fhTrklZ0xHMul =
new TH2F(Form("hTrklZ0xHMul"),
Form("Tracklet Z0x vs. Hit - Multiplicity; HMul_{Tracklet}; Z0x"),
8,
2,
10,
100,
-500,
500);
fhTrklZ0yHMul =
new TH2F(Form("hTrklZ0yHMul"),
Form("Tracklet Z0y vs. Hit - Multiplicity; HMul_{Tracklet}; Z0y"),
8,
2,
10,
100,
-300,
300);
fhTrklTxHMul =
new TH2F(Form("hTrklTxHMul"),
Form("Tracklet Tx vs. Hit - Multiplicity; HMul_{Tracklet}; Tx"),
8,
2,
10,
100,
-0.65,
0.65);
fhTrklTyHMul =
new TH2F(Form("hTrklTyHMul"),
Form("Tracklet Ty vs. Hit - Multiplicity; HMul_{Tracklet}; Ty"),
8,
2,
10,
100,
-0.65,
0.65);
Double_t TTMAX = 0.2;
fhTrklTtHMul =
new TH2F(Form("hTrklTtHMul"),
Form("Tracklet Tt vs. Hit - Multiplicity; HMul_{Tracklet}; Tt"),
8,
2,
10,
100,
-TTMAX,
TTMAX);
fhTrklVelHMul = new TH2F(
Form("hTrklVelHMul"),
Form("Tracklet Vel vs. Hit - Multiplicity; HMul_{Tracklet}; v (cm/ns)"),
8,
2,
10,
100,
0.,
50.);
fhTrklT0HMul =
new TH2F(Form("hTrklT0HMul"),
Form("Tracklet T0 vs. Hit - Multiplicity; HMul_{Tracklet}; T0"),
8,
2,
10,
100,
-0.5,
0.5);
fhTrklT0Mul = new TH2F(
Form("hTrklT0Mul"),
Form(
"Tracklet #DeltaT0 vs. Trkl - Multiplicity; Mul_{Tracklet}; #Delta(T0)"),
10,
0,
10,
100,
-2.,
2.);
fhTrklDT0SmMis = new TH2F(
Form("hTrklDT0SmMis"),
Form("Tracklet DeltaT0 vs. Trkl - ID; SmType_{missed}; #Delta(T0)"),
10,
0,
10,
100,
-2.,
2.);
fhTrklDT0StMis2 = new TH2F(
Form("hTrklDT0SmMis2"),
Form("Tracklet DeltaT0 vs. Station - ID; St2_{missed}; #Delta(T0)"),
50,
0,
50,
100,
-2.,
2.);
Double_t X0MAX = 40.;
fhTrklXY0_0 =
new TH2F(Form("hTrklXY0_0"),
Form("Tracklet XY at z=0 for hmulmax ; x (cm); y (cm)"),
100,
-X0MAX,
X0MAX,
100,
-X0MAX,
X0MAX);
fhTrklXY0_1 =
new TH2F(Form("hTrklXY0_1"),
Form("Tracklet XY at z=0 for hmulmax-1 ; x (cm); y (cm)"),
100,
-X0MAX * 2.,
X0MAX * 2.,
100,
-X0MAX * 2.,
X0MAX * 2.);
fhTrklXY0_2 =
new TH2F(Form("hTrklXY0_2"),
Form("Tracklet XY at z=0 for hmulmax-2 ; x (cm); y (cm)"),
100,
-X0MAX * 3.,
X0MAX * 3.,
100,
-X0MAX * 3.,
X0MAX * 3.);
Double_t DT0MAX = 5.;
if (fT0MAX == 0) fT0MAX = DT0MAX;
fhPullT_Smt =
new TH2F(Form("hPullT_Smt"),
Form("Tracklet ResiT vs RpcInd ; RpcInd ; #DeltaT (ns)"),
nSmt,
0,
nSmt,
501,
-fT0MAX,
fT0MAX);
Double_t DX0MAX = 5.;
fhPullX_Smt =
new TH2F(Form("hPullX_Smt"),
Form("Tracklet ResiX vs RpcInd ; RpcInd ; #DeltaX (cm)"),
nSmt,
0,
nSmt,
100,
-DX0MAX,
DX0MAX);
Double_t DY0MAX = 5.;
fhPullY_Smt =
new TH2F(Form("hPullY_Smt"),
Form("Tracklet ResiY vs RpcInd ; RpcInd ; #DeltaY (cm)"),
nSmt,
0,
nSmt,
100,
-DY0MAX,
DY0MAX);
Double_t DZ0MAX = 20.;
fhPullZ_Smt =
new TH2F(Form("hPullZ_Smt"),
Form("Tracklet ResiZ vs RpcInd ; RpcInd ; #DeltaZ (cm)"),
nSmt,
0,
nSmt,
100,
-DZ0MAX,
DZ0MAX);
fhTOff_Smt = new TH2F(Form("hTOff_Smt"),
Form("Tracklet TOff; RpcInd ; TOff (ns)"),
nSmt,
0,
nSmt,
501,
-fT0MAX,
fT0MAX);
fhTOff_HMul2 = new TH2F(Form("hTOff_HMul2"),
Form("Tracklet TOff(HMul2); RpcInd ; TOff (ns)"),
nSmt,
0,
nSmt,
500,
-fT0MAX,
fT0MAX);
Double_t DTTMAX = 0.09;
fhDeltaTt_Smt = new TH2F(Form("hDeltaTt_Smt"),
Form("Tracklet DeltaTt; RpcInd ; #DeltaTt (ns/cm)"),
nSmt,
0,
nSmt,
100,
-DTTMAX,
DTTMAX);
vhPullX.resize(fNTofStations);
vhPullY.resize(fNTofStations);
vhPullZ.resize(fNTofStations);
vhPullT.resize(fNTofStations);
vhPullTB.resize(fNTofStations);
vhResidualTBWalk.resize(fNTofStations);
vhResidualYWalk.resize(fNTofStations);
vhXY_AllTracks.resize(fNTofStations);
vhXY_AllStations.resize(fNTofStations);
vhXY_MissedStation.resize(fNTofStations);
vhXY_DX.resize(fNTofStations);
vhXY_DY.resize(fNTofStations);
vhXY_DT.resize(fNTofStations);
vhXY_TOT.resize(fNTofStations);
vhXY_CSZ.resize(fNTofStations);
vhUDXDY_DT.resize(fNTofStations);
vhUCDXDY_DT.resize(fNTofStations);
for (Int_t iSt = 0; iSt < fNTofStations; iSt++) {
vhPullX[iSt] = new TH1F(Form("hPullX_Station_%d", iSt),
Form("hResiX_Station_%d; #DeltaX (cm)", iSt),
99,
-DX0MAX,
DX0MAX);
vhPullY[iSt] = new TH1F(Form("hPullY_Station_%d", iSt),
Form("hResiY_Station_%d; #DeltaY (cm)", iSt),
99,
-DY0MAX,
DY0MAX);
vhPullZ[iSt] = new TH1F(Form("hPullZ_Station_%d", iSt),
Form("hResiZ_Station_%d; #DeltaZ (cm)", iSt),
99,
-50.,
50.);
vhPullT[iSt] = new TH1F(Form("hPullT_Station_%d", iSt),
Form("hResiT_Station_%d; #DeltaT (ns)", iSt),
59,
-fT0MAX,
fT0MAX);
vhPullTB[iSt] = new TH1F(Form("hPullTB_Station_%d", iSt),
Form("hResiTB_Station_%d; #DeltaT (ns)", iSt),
59,
-1.25 * fT0MAX,
1.25 * fT0MAX);
const Double_t TOTmax = 50.;
vhResidualTBWalk[iSt] =
new TH2F(Form("hResidualTBWalk_Station_%d", iSt),
Form("hResidualTBWalk_Station_%d; #DeltaT (ns)", iSt),
TOTmax,
0.,
TOTmax,
59,
-1.25 * fT0MAX,
1.25 * fT0MAX);
vhResidualYWalk[iSt] =
new TH2F(Form("hResidualYWalk_Station_%d", iSt),
Form("hResidualYWalk_Station_%d; #DeltaT (ns)", iSt),
TOTmax,
0.,
TOTmax,
59,
-DY0MAX,
DY0MAX);
Double_t XSIZ = 16.;
Int_t Nbins = 32.;
CbmTofCell* fChannelInfo = fDigiPar->GetCell(fMapStationRpcId[iSt]);
if (NULL == fChannelInfo) {
LOG(fatal) << "Geometry for station " << iSt << ", Rpc "
<< fMapStationRpcId[iSt] << " not defined ";
return;
}
Int_t NbinsX = 2 * XSIZ / fChannelInfo->GetSizex();
vhXY_AllTracks[iSt] =
new TH2F(Form("hXY_AllTracks_%d", iSt),
Form("hXY_AllTracks_%d; x(cm); y (cm)", iSt),
NbinsX,
-XSIZ,
XSIZ,
Nbins,
-XSIZ,
XSIZ);
vhXY_AllStations[iSt] =
new TH2F(Form("hXY_AllStations_%d", iSt),
Form("hXY_AllStations_%d; x(cm); y (cm)", iSt),
NbinsX,
-XSIZ,
XSIZ,
Nbins,
-XSIZ,
XSIZ);
vhXY_MissedStation[iSt] =
new TH2F(Form("hXY_MissedStation_%d", iSt),
Form("hXY_MissedStation_%d; x(cm); y (cm)", iSt),
NbinsX,
-XSIZ,
XSIZ,
Nbins,
-XSIZ,
XSIZ);
vhXY_DX[iSt] =
new TH3F(Form("hXY_DX_%d", iSt),
Form("hXY_DX_%d; x(cm); y (cm); #DeltaX (cm)", iSt),
NbinsX,
-XSIZ,
XSIZ,
Nbins,
-XSIZ,
XSIZ,
Nbins,
-2.,
2.);
vhXY_DY[iSt] =
new TH3F(Form("hXY_DY_%d", iSt),
Form("hXY_DY_%d; x(cm); y (cm); #DeltaY (cm)", iSt),
NbinsX,
-XSIZ,
XSIZ,
Nbins,
-XSIZ,
XSIZ,
Nbins,
-2.,
2.);
vhXY_DT[iSt] =
new TH3F(Form("hXY_DT_%d", iSt),
Form("hXY_DT_%d; x(cm); y (cm); #DeltaT (ns)", iSt),
NbinsX,
-XSIZ,
XSIZ,
Nbins,
-XSIZ,
XSIZ,
Nbins,
-0.5,
0.5);
vhXY_TOT[iSt] =
new TH3F(Form("hXY_TOT_%d", iSt),
Form("hXY_TOT_%d; x(cm); y (cm); TOT (a.u.)", iSt),
NbinsX,
-XSIZ,
XSIZ,
Nbins,
-XSIZ,
XSIZ,
Nbins,
0.,
10.);
vhXY_CSZ[iSt] = new TH3F(Form("hXY_CSZ_%d", iSt),
Form("hXY_CSZ_%d; x(cm); y (cm); CSZ ()", iSt),
NbinsX,
-XSIZ,
XSIZ,
Nbins,
-XSIZ,
XSIZ,
6,
1.,
7.);
vhUDXDY_DT[iSt] = new TH3F(Form("hUDXDY_DT_%d", iSt),
Form("Unused missing hit - DXDY_DT_%d; #Deltax "
"(cm); #Deltay (cm); #DeltaT (ns)",
iSt),
11,
-3.,
3.,
11,
-3.,
3.,
101,
-50.,
50.);
vhUCDXDY_DT[iSt] = new TH3F(Form("hUCDXDY_DT_%d", iSt),
Form("Unused close hit - DXDY_DT_%d; #Deltax "
"(cm); #Deltay (cm); #DeltaT (ns)",
iSt),
11,
-3.,
3.,
11,
-3.,
3.,
101,
-50.,
50.);
}
// vertex histrograms
Double_t NNORM = 40.;
fhVTXNorm = new TH1F(Form("hVTXNorm"),
Form("Vertex Normalisation; #_{TrackletHits}"),
NNORM,
0,
NNORM);
fhVTX_XY0 = new TH2F(Form("hVTX_XY0"),
Form("Vertex XY at z=0 ; x (xm); y (cm)"),
100,
-X0MAX,
X0MAX,
100,
-X0MAX,
X0MAX);
fhVTX_DT0_Norm =
new TH2F(Form("hVTX_DT0_Norm"),
Form("Vertex #DeltaT at z=0 ; #_{TrackletHits}; #DeltaT (ns)"),
NNORM,
0,
NNORM,
100,
-2.,
2.);
gDirectory->cd(
oldir
->GetPath()); // <= To prevent histos from being sucked in by the param file of the TRootManager!
}
void CbmTofFindTracks::FindVertex() {
fVTX_T = 0.; //reset
fVTX_X = 0.;
fVTX_Y = 0.;
fVTX_Z = 0.;
fVTXNorm = 0.;
for (Int_t iTrk = 0; iTrk < fTrackArray->GetEntries(); iTrk++) {
CbmTofTracklet* pTrk = (CbmTofTracklet*) fTrackArray->At(iTrk);
if (NULL == pTrk) continue;
Double_t w = pTrk->GetNofHits();
LOG(debug1) << Form(
"CbmTofFindTracks::FindVertex: N %3.0f, w %3.0f, min %d",
fVTXNorm,
w,
fMinNofHits);
if (w > (Double_t)
fMinNofHits) { // for further analysis request minimum number of hits
fVTXNorm += w;
fVTX_T += w * pTrk->GetFitT(0.);
fVTX_X += w * pTrk->GetFitX(0.);
fVTX_Y += w * pTrk->GetFitY(0.);
}
}
if (fVTXNorm > 0.) {
fVTX_T /= fVTXNorm;
fVTX_X /= fVTXNorm;
fVTX_Y /= fVTXNorm;
fVTX_Z /= fVTXNorm;
}
LOG(debug) << Form(
"CbmTofFindTracks::FindVertex: N %3.0f, T %6.2f, X=%6.2f, Y=%6.2f Z=%6.2f ",
fVTXNorm,
fVTX_T,
fVTX_X,
fVTX_Y,
fVTX_Z);
}
static Int_t iWarnNotDefined = 0;
void CbmTofFindTracks::FillHistograms() {
// Locate reference ("beam counter") hit
CbmTofHit* pRefHit = NULL;
Double_t RefMinTime = 1.E300;
for (Int_t iHit = 0; iHit < fTofHitArray->GetEntries();
iHit++) { // loop over Hits
CbmTofHit* pHit = (CbmTofHit*) fTofHitArray->At(iHit);
Int_t iAddr = (pHit->GetAddress() & DetMask);
if (fiBeamCounter != -1) {
if (iAddr == fiBeamCounter)
if (pHit->GetTime() < RefMinTime) {
pRefHit = pHit;
RefMinTime = pRefHit->GetTime();
}
} else { // take earliest hit as reference
if (pHit->GetTime() < RefMinTime) {
pRefHit = pHit;
RefMinTime = pRefHit->GetTime();
}
}
}
if (fiBeamCounter != -1 && NULL == pRefHit) return;
std::vector<Int_t> HMul;
HMul.resize(fNTofStations + 1);
// HMul.clear();
fhTrklMul->Fill(fTrackArray->GetEntries());
Int_t iTMul = 0;
for (Int_t iTrk = 0; iTrk < fTrackArray->GetEntries(); iTrk++) {
CbmTofTracklet* pTrk = (CbmTofTracklet*) fTrackArray->At(iTrk);
if (NULL == pTrk) continue;
if (pTrk->GetNofHits() > fNTofStations) {
LOG(error) << "CbmTofFindTracks::FillHistograms: more hits ("
<< pTrk->GetNofHits() << ") than stations (" << fNTofStations
<< ")";
continue;
}
HMul[pTrk->GetNofHits()]++;
if (pTrk->GetNofHits() >= 2) { // initial offset calibration
//Int_t iH0 = pTrk->GetStationHitIndex(fMapStationRpcId[0]); // Hit index for station 0 (Diamond)
//if(iH0<0) continue; // Station 0 not part of tracklet
// Int_t iDetId0 = pTrk->GetTofDetIndex(0); // DetId of 1. Hit (FU) not used
// Int_t iSt0 = GetStationOfAddr(iDetId0); // Station of 1. Hit (FU) not used
CbmTofHit* pHit0 = pTrk->GetTofHitPointer(0);
Double_t dTRef0 = pHit0->GetTime() - pHit0->GetR() * fTtTarg;
for (Int_t iH = 1; iH < pTrk->GetNofHits(); iH++) {
Int_t iDetId = pTrk->GetTofDetIndex(iH); // DetId of iH. Hit
CbmTofHit* pHit = pTrk->GetTofHitPointer(iH);
Int_t iSt = GetStationOfAddr(iDetId); // Station of 1. Hit
Double_t dTOff = pHit->GetTime() - pHit->GetR() * fTtTarg - dTRef0;
LOG(debug1) << Form("<D> CbmTofFindTracks::FillHistograms: iDetId1 "
"0x%08x, iST1 = %d with dTOff %f at RpcInd %d",
iDetId,
iSt,
dTOff,
fMapRpcIdParInd[fMapStationRpcId[iSt]]);
fhTOff_HMul2->Fill((Double_t) fMapRpcIdParInd[fMapStationRpcId[iSt]],
dTOff);
} // loop over tracklets' hits
}
if (
pTrk->GetNofHits()
> fMinNofHits) { // for further analysis request at least 3 matched hits
iTMul++;
fhTrklChi2->Fill(pTrk->GetNofHits(), pTrk->GetChiSq());
if (fiCalOpt > 0) fTofCalibrator->FillCalHist(pTrk);
CbmTofTrackletParam* tPar = pTrk->GetTrackParameter();
Double_t dTt = pTrk->GetTt();
LOG(debug) << Form("Trk %d info: Lz=%6.2f Z0x=%6.2f Z0y=%6.2f Tt=%6.4f",
iTrk,
tPar->GetLz(),
pTrk->GetZ0x(),
pTrk->GetZ0y(),
dTt)
<< tPar->ToString();
fhTrklZ0xHMul->Fill(pTrk->GetNofHits(), pTrk->GetFitX(0.));
fhTrklZ0yHMul->Fill(pTrk->GetNofHits(), pTrk->GetFitY(0.));
fhTrklTxHMul->Fill(pTrk->GetNofHits(), tPar->GetTx());
fhTrklTyHMul->Fill(pTrk->GetNofHits(), tPar->GetTy());
fhTrklTtHMul->Fill(pTrk->GetNofHits(), dTt);
switch (GetNReqStations() - pTrk->GetNofHits()) {
case 0: // max hit number
fhTrklXY0_0->Fill(pTrk->GetFitX(0.), pTrk->GetFitY(0.));
break;
case 1: fhTrklXY0_1->Fill(pTrk->GetFitX(0.), pTrk->GetFitY(0.)); break;
case 2: fhTrklXY0_2->Fill(pTrk->GetFitX(0.), pTrk->GetFitY(0.)); break;
default:;
}
if (fiBeamCounter > -1 && fdR0Lim > 0.) // consider only tracks originating from nominal interaction point
{
if (pTrk->GetR0() > fdR0Lim) continue;
}
if (dTt > 0.)
for (Int_t iSt = 0; iSt < fNTofStations; iSt++) {
Int_t iH = pTrk->GetStationHitIndex(
fMapStationRpcId[iSt]); // Station Hit index
if (iH < 0) continue; // Station not part of tracklet
fhUsedHitsStation->Fill(iSt);
if (pTrk->GetNofHits() < GetNReqStations())
continue; // fill Pull histos only for complete tracks
CbmTofHit* pHit = (CbmTofHit*) fTofHitArray->At(iH);
//if (0 == fMapStationRpcId[iSt]) pHit->SetTime(pTrk->GetT0()); // set time of fake hit, abandoned
/*
cout << " -D- CbmTofFindTracks::FillHistograms: "<< iSt <<", "
<<fMapStationRpcId[iSt]<<", "<< iH <<", "<< iH0 <<", "<<pHit->ToString() << endl;
*/
Double_t dDZ =
pHit->GetZ() - tPar->GetZ(); // z- Distance to reference point
Double_t dDX =
pHit->GetX()
- pTrk->GetFitX(
pHit->GetZ()); // - tPar->GetX() - tPar->GetTx()*dDZ;
Double_t dDY =
pHit->GetY() - pTrk->GetFitY(pHit->GetZ()); // - tPar->GetTy()*dDZ;
Double_t dDT =
pHit->GetTime()
- pTrk->GetFitT(
pHit->GetZ()); // pTrk->GetTdif(fMapStationRpcId[iSt]);
Double_t dDTB =
fTrackletTools->GetTdif(pTrk,
fMapStationRpcId[iSt],
pHit); // ignore pHit in calc of reference
Double_t dTOT = pHit->GetCh() / 10.; // misuse of channel field
Double_t dZZ = pHit->GetZ() - tPar->GetZy(pHit->GetY());
LOG(debug) << Form(
" St %d Id 0x%08x Hit %2d, Z %6.2f - DX %6.2f, DY %6.2f, "
"Z %6.2f, DT %6.2f, %6.2f, ZZ %6.2f, Tt %6.4f ",
iSt,
fMapStationRpcId[iSt],
iH,
pHit->GetZ(),
dDX,
dDY,
dDZ,
dDT,
dDTB,
dZZ,
dTt) << tPar->ToString();
vhPullX[iSt]->Fill(dDX);
vhPullY[iSt]->Fill(dDY);
vhPullZ[iSt]->Fill(dZZ);
vhPullT[iSt]->Fill(dDT);
vhPullTB[iSt]->Fill(dDTB);
vhResidualTBWalk[iSt]->Fill(dTOT, dDTB);
vhResidualYWalk[iSt]->Fill(dTOT, dDY);
fhPullT_Smt->Fill((Double_t) fMapRpcIdParInd[fMapStationRpcId[iSt]],
dDT);
fhPullX_Smt->Fill((Double_t) fMapRpcIdParInd[fMapStationRpcId[iSt]],
dDX);
fhPullY_Smt->Fill((Double_t) fMapRpcIdParInd[fMapStationRpcId[iSt]],
dDY);
/*
fhPullT_Smt->Fill((Double_t)fMapRpcIdParInd[fMapStationRpcId[iSt]], fTrackletTools->GetTdif(pTrk,fMapStationRpcId[iSt], pHit) );
fhPullX_Smt->Fill((Double_t)fMapRpcIdParInd[fMapStationRpcId[iSt]], fTrackletTools->GetXdif(pTrk,fMapStationRpcId[iSt], pHit) );
fhPullY_Smt->Fill((Double_t)fMapRpcIdParInd[fMapStationRpcId[iSt]], fTrackletTools->GetYdif(pTrk,fMapStationRpcId[iSt], pHit) );
*/
fhPullZ_Smt->Fill((Double_t) fMapRpcIdParInd[fMapStationRpcId[iSt]],
dZZ);
Double_t dDeltaTt = dTt - fTtTarg;
fhDeltaTt_Smt->Fill((Double_t) fMapRpcIdParInd[fMapStationRpcId[iSt]],
dDeltaTt);
//XXX use BRef as Referenz!!!
if (pRefHit != NULL) {
Double_t dTOff =
dDeltaTt * //pHit->GetR();
TMath::Sqrt(TMath::Power(pHit->GetX() - pRefHit->GetX(), 2)
+ TMath::Power(pHit->GetY() - pRefHit->GetY(), 2)
+ TMath::Power(pHit->GetZ() - pRefHit->GetZ(), 2))
* TMath::Sign(1, pHit->GetZ() - pRefHit->GetZ());
fhTOff_Smt->Fill((Double_t) fMapRpcIdParInd[fMapStationRpcId[iSt]],
dTOff);
}
}
// extrapolation of tracklet to vertex @ z=0
// FairTrackParam paramExtr;
// fFitter->Extrapolate(pTrk->GetParamFirst(),0.,¶mExtr);
} // condition on NofHits>2 end
// monitoring of tracklet hits with selected velocities from reference counters
if (TMath::Abs(pTrk->GetRefVel((UInt_t)(fNReqStations - 1)) - fdRefVelMean)
< fdRefDVel) {
fhTrklVelHMul->Fill(pTrk->GetNofHits(), 1. / pTrk->GetTt());
for (Int_t iH = 0; iH < pTrk->GetNofHits(); iH++) {
CbmTofHit* pHit = pTrk->GetTofHitPointer(iH);
Int_t iChId = pHit->GetAddress();
CbmTofCell* fChannelInfo = fDigiPar->GetCell(iChId);
if (NULL == fChannelInfo) continue;
Int_t iAddr = iChId & DetMask;
Int_t iSt = GetStationOfAddr(iAddr);
Double_t hitpos[3] = {3 * 0.};
Double_t hitpos_local[3] = {3 * 0.};
gGeoManager->FindNode(
fChannelInfo->GetX(), fChannelInfo->GetY(), fChannelInfo->GetZ());
Int_t iRpcInd = fMapRpcIdParInd[iChId & DetMask];
hitpos[0] =
pHit->GetX() - (Double_t) fhPullX_Smt_Off->GetBinContent(iRpcInd + 1);
hitpos[1] =
pHit->GetY() - (Double_t) fhPullY_Smt_Off->GetBinContent(iRpcInd + 1);
hitpos[2] =
pHit->GetZ() - (Double_t) fhPullZ_Smt_Off->GetBinContent(iRpcInd + 1);
gGeoManager->MasterToLocal(hitpos, hitpos_local);
vhXY_AllTracks[iSt]->Fill(hitpos_local[0], hitpos_local[1]);
}
if (pTrk->GetNofHits() >= fNReqStations) { // all possible hits are there
LOG(debug) << "Complete Tracklet in event " << fiEvent;
for (Int_t iSt = 0; iSt < fNTofStations; iSt++) {
Int_t iH = pTrk->GetStationHitIndex(
fMapStationRpcId[iSt]); // Station Hit index
if (iH < 0) {
LOG(debug) << " Incomplete Tracklet, skip station " << iSt;
continue; // Station not part of tracklet
}
CbmTofHit* pHit = (CbmTofHit*) fTofHitArray->At(iH);
Int_t iChId = pHit->GetAddress();
Double_t hitpos[3] = {3 * 0.};
Double_t hitpos_local[3] = {3 * 0.};
CbmTofCell* fChannelInfo = fDigiPar->GetCell(iChId);
if (NULL == fChannelInfo) {
//faked hit, take init values
} else {
/* TGeoNode *fNode=*/ // prepare global->local trafo
gGeoManager->FindNode(
fChannelInfo->GetX(), fChannelInfo->GetY(), fChannelInfo->GetZ());
Int_t iRpcInd = fMapRpcIdParInd[iChId & DetMask];
hitpos[0] =
pHit->GetX()
- (Double_t) fhPullX_Smt_Off->GetBinContent(iRpcInd + 1);
hitpos[1] =
pHit->GetY()
- (Double_t) fhPullY_Smt_Off->GetBinContent(iRpcInd + 1);
hitpos[2] =
pHit->GetZ()
- (Double_t) fhPullZ_Smt_Off->GetBinContent(iRpcInd + 1);
/* TGeoNode* cNode= gGeoManager->GetCurrentNode();*/
gGeoManager->MasterToLocal(hitpos, hitpos_local);
}
vhXY_AllStations[iSt]->Fill(hitpos_local[0], hitpos_local[1]);
Double_t dDX =
pHit->GetX()
- pTrk->GetFitX(
pHit->GetZ()); // - tPar->GetX() - tPar->GetTx()*dDZ;
Double_t dDY =
pHit->GetY() - pTrk->GetFitY(pHit->GetZ()); // - tPar->GetTy()*dDZ;
//Double_t dDT = pHit->GetTime() - pTrk->GetFitT(pHit->GetR()); //pTrk->GetTdif(fMapStationRpcId[iSt]);
Double_t dDTB =
fTrackletTools->GetTdif(pTrk,
fMapStationRpcId[iSt],
pHit); // ignore pHit in calc of reference
vhXY_DX[iSt]->Fill(hitpos_local[0], hitpos_local[1], dDX);
vhXY_DY[iSt]->Fill(hitpos_local[0], hitpos_local[1], dDY);
vhXY_DT[iSt]->Fill(hitpos_local[0], hitpos_local[1], dDTB);
Double_t dCSZ = ((Double_t)(pHit->GetFlag() % 100)) * 0.5;
Double_t dTOT = ((Double_t) pHit->GetCh()) * 0.1
/ dCSZ; // counteract UHIT flagging
vhXY_TOT[iSt]->Fill(hitpos_local[0], hitpos_local[1], dTOT);
vhXY_CSZ[iSt]->Fill(hitpos_local[0], hitpos_local[1], dCSZ);
// debugging consistency of geometry transformations ....
if (FairLogger::GetLogger()->IsLogNeeded(fair::Severity::debug)) {
if (iSt == fNReqStations - 1) { // treat as if not found
Int_t iAddr = fMapStationRpcId[iSt];
CbmTofCell* fChannelInfoD = fDigiPar->GetCell(iAddr);
Double_t zPos = 0;
Double_t zPosMiss = -1;
Double_t hitposD[3];
Double_t hitpos_localD[3];
Int_t NIter = 5;
Int_t iRpcInd = fMapRpcIdParInd[iAddr];
Int_t iNbCh =
fDigiBdfPar->GetNbChan(CbmTofAddress::GetSmType(iAddr),
CbmTofAddress::GetRpcId(iAddr));
while (zPos != zPosMiss && 0 < NIter--) {
fChannelInfoD = fDigiPar->GetCell(iAddr);
gGeoManager->FindNode(fChannelInfoD->GetX(),
fChannelInfoD->GetY(),
fChannelInfoD->GetZ());
zPos = fChannelInfoD->GetZ()
+ (Double_t) fhPullZ_Smt_Off->GetBinContent(iRpcInd + 1);
hitposD[0] =
pTrk->GetFitX(zPos)
- (Double_t) fhPullX_Smt_Off->GetBinContent(iRpcInd + 1);
hitposD[1] =
pTrk->GetFitY(zPos)
- (Double_t) fhPullY_Smt_Off->GetBinContent(iRpcInd + 1);
hitposD[2] = fChannelInfoD->GetZ();
/* TGeoNode* cNode=*/gGeoManager->GetCurrentNode();
gGeoManager->MasterToLocal(hitposD, hitpos_localD);
// Check for consistency of geometry
Int_t iChTrafo = CbmTofAddress::GetChannelId(iAddr);
Int_t iChMiss = hitpos_localD[0] / fChannelInfoD->GetSizex()
+ (iNbCh - 1) / 2;
if (iChMiss < 0) iChMiss = 0;
if (iChMiss > iNbCh - 1) iChMiss = iNbCh - 1;
assert(fDigiBdfPar);
if (iChMiss > -1 && iChMiss < iNbCh) {
Int_t iAddrMiss = CbmTofAddress::GetUniqueAddress(
CbmTofAddress::GetSmId(iAddr),
CbmTofAddress::GetRpcId(iAddr),
iChMiss,
0,
CbmTofAddress::GetSmType(iAddr));
CbmTofCell* fChannelInfoMiss = fDigiPar->GetCell(iAddrMiss);
if (NULL == fChannelInfoMiss) {
LOG(fatal)
<< Form("Geo consistency check 0x%08x, 0x%08x failed at "
"St%d, z=%7.2f,%7.2f: iChTrafo %d, Miss %d , "
"xloc %6.2f, dx %4.2f",
iAddr,
iAddrMiss,
iSt,
zPos,
zPosMiss,
iChTrafo,
iChMiss,
hitpos_local[0],
fChannelInfo->GetSizex());
}
zPosMiss =
fChannelInfoMiss->GetZ()
+ (Double_t) fhPullZ_Smt_Off->GetBinContent(iRpcInd + 1);
LOG(debug) << Form(
"Geo consistency check 0x%08x at St%d, z=%7.2f,%7.2f: "
"iChTrafo %d, Miss %d , xloc %6.2f, dx %4.2f",
iAddr,
iSt,
zPos,
zPosMiss,
iChTrafo,
iChMiss,
hitpos_localD[0],
fChannelInfoD->GetSizex());
fChannelInfo = fChannelInfoMiss;
iAddr = iAddrMiss;
} else
zPosMiss = zPos;
LOG(debug) << Form(
"Predicted hit in Last Station 0x%08x at local pos x %6.2f, "
"y %6.2f, z %6.2f, cell %p",
iAddr,
hitpos_localD[0],
hitpos_localD[1],
zPos,
fChannelInfoD);
LOG(debug) << Form(
"Measured hit in Last Station 0x%08x at local pos x %6.2f, "
"y %6.2f, z %6.2f, cell %p",
pHit->GetAddress(),
hitpos_local[0],
hitpos_local[1],
pHit->GetZ(),
fChannelInfo);
}
}
}
}
} else {
if (pTrk->GetNofHits() == fNReqStations - 1) { // one hit missing
for (Int_t iSt = 0; iSt < fNTofStations; iSt++) {
Int_t iH = pTrk->GetStationHitIndex(
fMapStationRpcId[iSt]); // Station Hit index
if (iH < 0) { // find geo element for the missing Station iSt
Int_t iAddr = fMapStationRpcId[iSt];
if (iAddr < 1) continue;
//Int_t iChId = CbmTofAddress::GetUniqueAddress(0,0,0,0,iSmType);
//CbmTofCell* fChannelInfo = fDigiPar->GetCell( iChId );
CbmTofCell* fChannelInfo = fDigiPar->GetCell(iAddr);
if (NULL == fChannelInfo) {
if (iWarnNotDefined++ < 100)
LOG(warning) << Form("CbmTofFindTracks::FillHistograms: Cell "
"0x%08x not defined for Station %d",
iAddr,
iSt);
continue;
}
/* TGeoNode *fNode= */ // prepare global->local trafo
Double_t zPos = 0;
Double_t zPosMiss = -1;
Double_t hitpos[3];
Double_t hitpos_local[3];
Int_t NIter = 5;
Int_t iRpcInd = fMapRpcIdParInd[iAddr];
Int_t iNbCh =
fDigiBdfPar->GetNbChan(CbmTofAddress::GetSmType(iAddr),
CbmTofAddress::GetRpcId(iAddr));
while (zPos != zPosMiss && 0 < NIter--) {
fChannelInfo = fDigiPar->GetCell(iAddr);
gGeoManager->FindNode(fChannelInfo->GetX(),
fChannelInfo->GetY(),
fChannelInfo->GetZ());
zPos = fChannelInfo->GetZ()
+ (Double_t) fhPullZ_Smt_Off->GetBinContent(iRpcInd + 1);
hitpos[0] =
pTrk->GetFitX(zPos)
- (Double_t) fhPullX_Smt_Off->GetBinContent(iRpcInd + 1);
hitpos[1] =
pTrk->GetFitY(zPos)
- (Double_t) fhPullY_Smt_Off->GetBinContent(iRpcInd + 1);
hitpos[2] = fChannelInfo->GetZ();
/* TGeoNode* cNode=*/gGeoManager->GetCurrentNode();
gGeoManager->MasterToLocal(hitpos, hitpos_local);
// Check for consistency of geometry
Int_t iChTrafo = CbmTofAddress::GetChannelId(iAddr);
Int_t iChMiss =
hitpos_local[0] / fChannelInfo->GetSizex() + (iNbCh - 1) / 2;
if (iChMiss < 0) iChMiss = 0;
if (iChMiss > iNbCh - 1) iChMiss = iNbCh - 1;
assert(fDigiBdfPar);
if (iChMiss > -1 && iChMiss < iNbCh) {
Int_t iAddrMiss = CbmTofAddress::GetUniqueAddress(
CbmTofAddress::GetSmId(iAddr),
CbmTofAddress::GetRpcId(iAddr),
iChMiss,
0,
CbmTofAddress::GetSmType(iAddr));
CbmTofCell* fChannelInfoMiss = fDigiPar->GetCell(iAddrMiss);
if (NULL == fChannelInfoMiss) {
LOG(fatal)
<< Form("Geo consistency check 0x%08x, 0x%08x failed at "
"St%d, z=%7.2f,%7.2f: iChTrafo %d, Miss %d , "
"xloc %6.2f, dx %4.2f",
iAddr,
iAddrMiss,
iSt,
zPos,
zPosMiss,
iChTrafo,
iChMiss,
hitpos_local[0],
fChannelInfo->GetSizex());
}
zPosMiss =
fChannelInfoMiss->GetZ()
+ (Double_t) fhPullZ_Smt_Off->GetBinContent(iRpcInd + 1);
LOG(debug) << Form(
"Geo consistency check 0x%08x at St%d, z=%7.2f,%7.2f: "
"iChTrafo %d, Miss %d , xloc %6.2f, dx %4.2f",
iAddr,
iSt,
zPos,
zPosMiss,
iChTrafo,
iChMiss,
hitpos_local[0],
fChannelInfo->GetSizex());
fChannelInfo = fChannelInfoMiss;
iAddr = iAddrMiss;
} else
zPosMiss = zPos;
}
if (iSt == fNReqStations - 1)
LOG(debug) << Form("Missing hit in Last Station in event %d at "
"local pos x %6.2f, y %6.2f, z %6.2f",
fiEvent,
hitpos_local[0],
hitpos_local[1],
zPos);
vhXY_MissedStation[iSt]->Fill(hitpos_local[0], hitpos_local[1]);
// correlation analysis
for (Int_t iTrk1 = iTrk + 1; iTrk1 < fTrackArray->GetEntries();
iTrk1++) {
CbmTofTracklet* pTrk1 =
(CbmTofTracklet*) fTrackArray->At(iTrk1);
if (NULL == pTrk1 || pTrk == pTrk1) continue;
if (pTrk1->GetNofHits()
>= fNReqStations) { // all possible hits are there
fhTrklDT0SmMis->Fill(iSt,
pTrk->GetFitT(0.) - pTrk1->GetFitT(0.));
} else {
if (pTrk1->GetNofHits()
== fNReqStations - 1) { // one hit missing
for (Int_t iSt1 = 0; iSt1 < fNTofStations; iSt1++) {
Int_t iH1 = pTrk1->GetStationHitIndex(
fMapStationRpcId[iSt1]); // Station Hit index
if (
iH1
< 0) { // find geo element for the missing Station iSt
//Int_t iSmType1 = fMapStationRpcId[iSt1]; (FU) not used
//if (iSmType1 < 1) continue;
fhTrklDT0StMis2->Fill(Double_t(iSt * 10 + iSt1),
pTrk->GetFitT(0.)
- pTrk1->GetFitT(0.));
}
}
}
}
}
}
}
}
}
} // velocity selection end
} // loop over tracklets end
if (HMul.size() > 3)
fhTrklMulMaxMM->Fill(HMul[fNTofStations], HMul[fNTofStations - 1]);
if (HMul.size() > 5)
fhTrklMul3D->Fill(
HMul[fNTofStations], HMul[fNTofStations - 1], HMul[fNTofStations - 2]);
fhTrklMulNhits->Fill(fTofHitArray->GetEntries(), iTMul);
fhTrackingTimeNhits->Fill(fTofHitArray->GetEntries(), fdTrackingTime);
// print info about special events
if (0)
if (5 < fNTofStations)
if (HMul[6] > 1) { // temporary
//if (HMul[fNTofStations]>0)
//LOG(info)<<"Found "<<HMul[fNTofStations]<<" max length tracklets in event "<<fiEvent
LOG(info) << "Found " << HMul[6] << " max length tracklets in event "
<< fiEvent << " within " << fTofHitArray->GetEntries()
<< " hits ";
for (Int_t iTrk = 0; iTrk < fTrackArray->GetEntries(); iTrk++) {
CbmTofTracklet* pTrk = (CbmTofTracklet*) fTrackArray->At(iTrk);
if (NULL == pTrk) continue;
pTrk->PrintInfo();
}
}
if (1)
if (fTrackArray->GetEntries() > 25) { // temporary
LOG(info) << "Found high multiplicity of " << fTrackArray->GetEntries()
<< " in event " << fiEvent << " from "
<< fTofHitArray->GetEntries() << " hits ";
for (Int_t iTrk = 0; iTrk < fTrackArray->GetEntries(); iTrk++) {
CbmTofTracklet* pTrk = (CbmTofTracklet*) fTrackArray->At(iTrk);
if (NULL == pTrk) continue;
pTrk->PrintInfo();
}
}
if (iTMul > 1) {
LOG(debug) << Form(
"CbmTofFindTracks::FillHistograms NTrkl %d(%d) in event %d",
iTMul,
fTrackArray->GetEntries(),
fiEvent);
for (Int_t iTrk = 0; iTrk < fTrackArray->GetEntries(); iTrk++) {
CbmTofTracklet* pTrk = (CbmTofTracklet*) fTrackArray->At(iTrk);
if (NULL == pTrk) continue;
if (
pTrk->GetNofHits()
> fMinNofHits) { // for further analysis request min # of matched hits
for (Int_t iTrk1 = iTrk + 1; iTrk1 < fTrackArray->GetEntries();
iTrk1++) {
CbmTofTracklet* pTrk1 = (CbmTofTracklet*) fTrackArray->At(iTrk1);
if (NULL == pTrk1) continue;
if (
pTrk1->GetNofHits()
> fMinNofHits) { // for further analysis request min # of matched hits
//cout << " -D- iT "<<iTrk<<", iT1 "<<iTrk1<<endl;
fhTrklT0Mul->Fill(iTMul, pTrk->GetFitT(0.) - pTrk1->GetFitT(0.));
}
}
}
}
}
LOG(debug1) << Form("CbmTofFindTracks::FillHistograms: HMul.size() %u ",
(UInt_t) HMul.size());
for (UInt_t uHMul = 2; uHMul < HMul.size(); uHMul++) {
LOG(debug1) << Form(
"CbmTofFindTracks::FillHistograms() HMul %u, #%d", uHMul, HMul[uHMul]);
if (HMul[uHMul] > 0) { fhTrklHMul->Fill(uHMul, HMul[uHMul]); }
}
for (Int_t iHit = 0; iHit < fTofHitArray->GetEntries();
iHit++) { // loop over Hits
CbmTofHit* pHit = (CbmTofHit*) fTofHitArray->At(iHit);
// Int_t iSmType = CbmTofAddress::GetSmType( pHit->GetAddress() & DetMask ); (FU) not used
Int_t iAddr = (pHit->GetAddress() & DetMask);
fhAllHitsSmTypes->Fill(GetStationOfAddr(iAddr));
//cout << " -D- " << iSmType <<", " << fTypeStation[iSmType] << endl;
if (GetStationOfAddr(iAddr) > -1)
fhAllHitsStation->Fill(GetStationOfAddr(iAddr));
}
// vertex stuff
fhVTXNorm->Fill(fVTXNorm);
if (fVTXNorm > 0.) {
fhVTX_XY0->Fill(fVTX_X, fVTX_Y);
for (Int_t iTrk = 0; iTrk < fTrackArray->GetEntries(); iTrk++) {
CbmTofTracklet* pTrk = (CbmTofTracklet*) fTrackArray->At(iTrk);
if (NULL == pTrk) continue;
if (Double_t w = pTrk->GetNofHits() > (Double_t) fMinNofHits) {
if (fVTXNorm > w) {
Double_t DeltaT0 =
pTrk->GetFitT(0.)
- (fVTXNorm * fVTX_T - w * pTrk->GetFitT(0.)) / (fVTXNorm - w);
fhVTX_DT0_Norm->Fill(fVTXNorm, DeltaT0);
}
}
}
}
if (0 == fMapStationRpcId[0]) { // Generated Pseudo TofHit at origin
fTofHitArray->RemoveAt(fTofHitArray->GetEntries() - 1); // remove added hit
}
}
void CbmTofFindTracks::SetStations(Int_t ival) {
fStationType.resize(fNTofStations);
for (Int_t i = 0; i < 10; i++)
fTypeStation[i] = -1; // initialize
for (Int_t i = 0; i < fNTofStations; i++) {
Int_t iSm = ival % 10;
Int_t iSt = fNTofStations - 1 - i;
Int_t iAddr = CbmTofAddress::GetUniqueAddress(0, 0, 0, 0, iSm);
fStationType[iSt] = iSm;
fTypeStation[iSm] = iSt;
fMapStationRpcId[iSt] = iAddr;
ival = (ival - iSm) / 10;
}
}
void CbmTofFindTracks::SetStation(Int_t iVal,
Int_t iModType,
Int_t iModId,
Int_t iRpcId) {
Int_t iCenterCh = 0;
if (NULL != fDigiBdfPar)
iCenterCh =
TMath::Floor((fDigiBdfPar->GetNbChan(iModType, iRpcId) - 1) / 2);
Int_t iAddr =
CbmTofAddress::GetUniqueAddress(iModId, iRpcId, iCenterCh, 0, iModType);
fMapStationRpcId[iVal] = iAddr;
}
void CbmTofFindTracks::SetBeamCounter(Int_t iModType,
Int_t iModId,
Int_t iRpcId) {
fiBeamCounter =
CbmTofAddress::GetUniqueAddress(iModId, iRpcId, 0, 0, iModType);
}
Int_t CbmTofFindTracks::GetStationOfAddr(Int_t iAddr) {
std::map<Int_t, Int_t>::iterator it;
for (it = fMapStationRpcId.begin(); it != fMapStationRpcId.end(); it++)
//std::map <Int_t, Int_t>::iterator it = fMapStationRpcId.find(iAddr);
if (it->second == iAddr) break;
/*
if(it->first == fMapStationRpcId.size())
{
PrintSetup();
LOG(fatal)<<Form("CbmTofFindTracks::GetStationOfAddr failed for 0x%08x, found Station = %d",iAddr,it->first)
;
}
*/
return it->first;
}
void CbmTofFindTracks::PrintSetup() {
for (std::map<Int_t, Int_t>::iterator it = fMapStationRpcId.begin();
it != fMapStationRpcId.end();
it++) {
cout << " <I> Tracking station " << it->first << " contains RpcId "
<< Form("0x%08x", it->second) << endl;
}
}
Double_t CbmTofFindTracks::GetTOff(Int_t iAddr) {
//cout << Form(" <D> GetTOff for 0x%08x at HistoIndex %d: %7.1f ", iAddr, fMapRpcIdParInd[iAddr],
//(Double_t)fhPullT_Smt_Off->GetBinContent( fMapRpcIdParInd[iAddr] + 1)) <<endl;
return (Double_t) fhPullT_Smt_Off->GetBinContent(fMapRpcIdParInd[iAddr] + 1);
}
Double_t CbmTofFindTracks::GetSigT(Int_t iAddr) {
return (Double_t) fhPullT_Smt_Width->GetBinContent(fMapRpcIdParInd[iAddr]
+ 1);
}
Double_t CbmTofFindTracks::GetSigX(Int_t iAddr) {
return (Double_t) fhPullX_Smt_Width->GetBinContent(fMapRpcIdParInd[iAddr]
+ 1);
}
Double_t CbmTofFindTracks::GetSigY(Int_t iAddr) {
return (Double_t) fhPullY_Smt_Width->GetBinContent(fMapRpcIdParInd[iAddr]
+ 1);
}
Double_t CbmTofFindTracks::GetSigZ(Int_t iAddr) {
return (Double_t) fhPullZ_Smt_Width->GetBinContent(fMapRpcIdParInd[iAddr]
+ 1);
}
Int_t CbmTofFindTracks::GetNStationsFired() {
Int_t iNSt = 0;
for (Int_t iSt = 0; iSt < fNTofStations; iSt++) {
if (fStationHMul[iSt] > 0 && fStationHMul[iSt] < fiStationMaxHMul) iNSt++;
LOG(debug2) << Form("Station %d, Addr 0x%08x, HMul %d, Max %d, Sum %d",
iSt,
GetAddrOfStation(iSt),
fStationHMul[iSt],
fiStationMaxHMul,
iNSt);
}
return iNSt;
}
void CbmTofFindTracks::ResetStationsFired() {
for (Int_t iSt = 0; iSt < fNTofStations; iSt++)
fStationHMul[iSt] = 0;
}
void CbmTofFindTracks::FillUHits() {
// collect unused hits in active tracking stations
Int_t iNbUHits = 0;
for (Int_t iHit = 0; iHit < fTofHitArray->GetEntries(); iHit++) {
CbmTofHit* pHit = (CbmTofHit*) fTofHitArray->At(iHit);
Int_t iAddr = (pHit->GetAddress() & DetMask);
if (pHit->GetFlag() < 100. && GetStationOfAddr(iAddr) < fNTofStations) {
if (!CheckHit2Track(pHit)) // check whether hit could belong to any track
new ((*fTofUHitArray)[iNbUHits++]) CbmTofHit(*pHit);
}
}
}
Bool_t CbmTofFindTracks::CheckHit2Track(CbmTofHit* pHit) {
Int_t iAddr = (pHit->GetAddress() & DetMask);
Int_t iSt = GetStationOfAddr(iAddr);
if (iSt < 0 || iSt >= GetNofStations()) return kFALSE;
for (Int_t iTrk = 0; iTrk < fTrackArray->GetEntries(); iTrk++) {
CbmTofTracklet* pTrk = (CbmTofTracklet*) fTrackArray->At(iTrk);
if (NULL == pTrk) continue;
Double_t dDX = pHit->GetX() - pTrk->GetFitX(pHit->GetZ());
Double_t dDY = pHit->GetY() - pTrk->GetFitY(pHit->GetZ());
Double_t dDT = pHit->GetTime() - pTrk->GetFitT(pHit->GetZ());
LOG(debug) << Form("Test Trk %d with HMul %d for Addr 0x%08x in station %d "
"with dx %5.1f, dy %5.1f, dt %5.1f",
iTrk,
pTrk->GetNofHits(),
iAddr,
iSt,
dDX,
dDY,
dDT);
if (!(pTrk->ContainsAddr(iAddr))) {
LOG(debug3) << "Fill histo " << vhUDXDY_DT[iSt]->GetName();
vhUDXDY_DT[iSt]->Fill(dDX, dDY, dDT);
} else {
vhUCDXDY_DT[iSt]->Fill(dDX, dDY, dDT);
}
}
return kFALSE;
}
void CbmTofFindTracks::CheckMaxHMul() {
fInspectEvent = kTRUE;
for (Int_t iSt = 0; iSt < fNTofStations; iSt++) {
if (fStationHMul[iSt] > fiStationMaxHMul) {
fInspectEvent = kFALSE;
} else {
if (fMapStationRpcId[iSt] == fiBeamCounter
&& fStationHMul[iSt] > fiBeamMaxHMul) {
fInspectEvent = kFALSE;
}
}
}
}
void CbmTofFindTracks::PrintMapRpcIdParInd() {
std::map<Int_t, Int_t>::iterator it = fMapRpcIdParInd.begin();
while (it != fMapRpcIdParInd.end()) {
LOG(info) << Form("MapRpcIdParInd: %d, 0x%08x ", it->second, it->first);
it++;
}
}