--- PamCut/CollectionActions/ReprocessTrackAction/ReprocessTrackAction.cpp 2010/06/24 17:21:19 1.2.2.1 +++ PamCut/CollectionActions/ReprocessTrackAction/ReprocessTrackAction.cpp 2011/11/30 16:57:49 1.2.2.3 @@ -11,8 +11,8 @@ _allEvents++; - TrkLevel1 *L1; - if (_newTrkL1) + TrkLevel1 *L1 = NULL; + if (_newTrkL1) { if (_externalFlag) if (!(*_externalFlag)) return; @@ -20,41 +20,83 @@ L1 = *_newTrkL1; // External L1 plus flag=true else L1 = *_newTrkL1; // External L1 plus no external flag + + // Set the new L1 inside PamLevel2 event + TrkLevel1 *oldTrkL1 = event->GetTrkLevel1(); + + // Sadly, there's no copy constructor for TrkLevel1. We have to copy manually... + // TODO: replace the following with TrkLevel1 copy constructor (if there will ever be one...) + // 1. Clean the structure + oldTrkL1->Set(); // Creates Cluster array if it doesn't exist + Int_t nClus = oldTrkL1->Cluster->GetEntries(); + for (Int_t i = 0; i < nClus; i++) { + TrkCluster *clstrPtr = (TrkCluster*) (oldTrkL1->Cluster->UncheckedAt(i)); + if (clstrPtr) { + delete[] clstrPtr->clsignal; + clstrPtr->clsignal = NULL; + delete[] clstrPtr->clsigma; + clstrPtr->clsigma = NULL; + delete[] clstrPtr->cladc; + clstrPtr->cladc = NULL; + delete[] clstrPtr->clbad; + clstrPtr->clbad = NULL; + } + } + oldTrkL1->Cluster->Clear("C"); + + // 2. Copy the new L1 into the old one + // 2.1 Fixed size public arrays + for (int i = 0; i < 12; i++) { + oldTrkL1->good[i] = (*_newTrkL1)->good[i]; + for (int j = 0; j < 24; j++) { + oldTrkL1->cn[j][i] = (*_newTrkL1)->cn[j][i]; + oldTrkL1->cnn[j][i] = (*_newTrkL1)->cnn[j][i]; + } + } + // 2.2 TClonesArray of TrkCluster objects + int nClusters = (*_newTrkL1)->Cluster->GetEntries(); + for (int i = 0; i < nClusters; i++) { + TrkCluster *currCluster = (TrkCluster*) ((*_newTrkL1)->Cluster->At(i)); + new ((*(oldTrkL1->Cluster))[i]) TrkCluster(*currCluster); + } + } else { - L1 = (TrkLevel1*) event->GetPointerTo("TrkLevel1"); // Internal L1 + + event->GetPointerTo("TrkLevel1"); // Internal L1 (create it if it doesn't exist) TrkLevel0 *L0 = event->GetTrkLevel0(); if (!L0) { cout << "Missing TrkLevel0 event " << endl; return; } - L0->ProcessEvent();// re-processing level0->level1 + L0->ProcessEvent(); // re-processing level0->level1 L1 = event->GetTrkLevel1(); L1->Clear(); L1->SetFromLevel1Struct(); } - // See if the event has a track before reprocessing - TrkLevel2 *trkl2 = event->GetTrkLevel2(); - bool hadTrack = false; - if (trkl2->GetTrkLevel2()->GetNTracks() > 0) - hadTrack = true; - - // Reprocess - _reprocessed++; - L1->ProcessEvent();// re-processing level1->level2 - - trkl2 = event->GetTrkLevel2(); - trkl2->Clear(); - trkl2->SetFromLevel2Struct(); - - // See if we gained or lost a track; - if (trkl2->GetNTracks() > 0) { - if (!hadTrack) { - _recoveredTracks++; + if (_reprocL2) { + // See if the event has a track before reprocessing + TrkLevel2 *trkl2 = event->GetTrkLevel2(); + bool hadTrack = false; + if (trkl2->GetTrkLevel2()->GetNTracks() > 0) + hadTrack = true; + + // Reprocess + _reprocessed++; + L1->ProcessEvent(); // re-processing level1->level2 + + trkl2 = event->GetTrkLevel2(); + trkl2->Clear(); + trkl2->SetFromLevel2Struct(); + + // See if we gained or lost a track; + if (trkl2->GetNTracks() > 0) { + if (!hadTrack) { + _recoveredTracks++; + } + } + else if (hadTrack) { + _lostTracks++; } - } - else if (hadTrack) { - _lostTracks++; } } -