--- PamCut/CollectionActions/RefitTrackAction/RefitTrackAction.cpp 2010/05/11 15:32:09 1.1.2.2 +++ PamCut/CollectionActions/RefitTrackAction/RefitTrackAction.cpp 2011/11/30 16:59:03 1.1.2.8 @@ -11,19 +11,36 @@ long int RefitTrackAction::_currEvent = -1; TString RefitTrackAction::_currTrkParamsFile = ""; +float RefitTrackAction::_xmBackup[6], RefitTrackAction::_ymBackup[6]; +int RefitTrackAction::_layerXBackup[6], RefitTrackAction::_layerYBackup[6]; + void RefitTrackAction::OnGood(PamLevel2 *event) { - // Reload the TRK parameters only if they have been changed (ie., if another instance of - // this class used a different set of parameters. + // Do something only if at least one track exists + if (event->GetTrkLevel2()->GetNTracks() == 0) + return; + + // Reload the TRK alignment parameters only if they have been changed (ie., if another instance of + // this class used a different set of parameters). if (_trkParamsFile != _currTrkParamsFile) { TrkParams::Set(_trkParamsFile, 5); _currTrkParamsFile = _trkParamsFile; } + if (_sortingMethod) + event->SetSortingMethod(_sortingMethod); TrkTrack *trkTrack = event->GetTrack(0)->GetTrkTrack(); if (!trkTrack) return; + // Check if good clusters have meaningful energy releases + for (UInt_t ip = 0; ip < 6; ip++) { + if (trkTrack->XGood(ip) == 1 && trkTrack->GetDEDX(ip, 0) <= 0.) + trkTrack->xgood[ip] = 0; // Set it to bad + if (trkTrack->YGood(ip) == 1 && trkTrack->GetDEDX(ip, 1) <= 0.) + trkTrack->ygood[ip] = 0; // Set it to bad + } + if (_currEvent != event->GetReadEntry()) { // Saves the original track data if the current event (recorded in the static member _currEvent) is // different from the actually processed event. This way, multiple instances of the class @@ -31,8 +48,8 @@ _currEvent = event->GetReadEntry(); // Save the original cluster status and measured positions for (int i = 0; i < 6; i++) { - _layerXBackup[i] = trkTrack->xgood[0]; - _layerYBackup[i] = trkTrack->ygood[0]; + _layerXBackup[i] = trkTrack->xgood[i]; + _layerYBackup[i] = trkTrack->ygood[i]; _xmBackup[i] = trkTrack->xm[i]; _ymBackup[i] = trkTrack->ym[i]; } @@ -43,17 +60,24 @@ for (int i = 0; i < 6; i++) { trkTrack->xm[i] = _xmBackup[i]; trkTrack->ym[i] = _ymBackup[i]; - _layerXBackup[i] = trkTrack->xgood[0]; - _layerYBackup[i] = trkTrack->ygood[0]; + trkTrack->xgood[i] = _layerXBackup[i]; + trkTrack->ygood[i] = _layerYBackup[i]; } } // Apply the gaussian spread - for (Int_t ip = 0; ip < 6; ip++) { - // gaussian distributed random number Gauss(mean,sigma) (in cm) - trkTrack->xm[ip] += _r3->Gaus(0., _spreadX); - trkTrack->ym[ip] += _r3->Gaus(0., _spreadY); + + if (_spreadX != 0.) { + for (Int_t ip = 0; ip < 6; ip++) { + // gaussian distributed random number Gauss(mean,sigma) (in cm) + trkTrack->xm[ip] += _r3->Gaus(0., _spreadX); + } + } + if (_spreadY != 0.) { + for (Int_t ip = 0; ip < 6; ip++) { + trkTrack->ym[ip] += _r3->Gaus(0., _spreadY); + } } // Mask the layers @@ -88,4 +112,10 @@ trkTrack->FitReset(); int fail = 0; trkTrack->Fit(0, fail, 0); + + if (fail) { + // Set a flag for the badly-refitted tracks: chi2 < 0 + if (trkTrack->chi2 >= 0.) + trkTrack->chi2 = -1.; + } }