--- PamCut/CollectionActions/ReprocessTrackAction/ReprocessTrackAction.cpp 2010/07/08 12:57:55 1.2.2.2 +++ 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,14 +20,55 @@ 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(); @@ -42,7 +83,7 @@ // Reprocess _reprocessed++; - L1->ProcessEvent();// re-processing level1->level2 + L1->ProcessEvent(); // re-processing level1->level2 trkl2 = event->GetTrkLevel2(); trkl2->Clear();