Esempio n. 1
0
Tracks * getTracksFromClusters(Int_t Runs, Int_t dataType, Int_t frameType, Float_t energy) {
   run_energy = energy;

   DataInterface   * di = new DataInterface();
   Int_t             nClusters = kEventsPerRun * 5 * nLayers;
   Int_t             nTracks = kEventsPerRun * 2;
   Bool_t            breakSignal = false;
   Clusters        * clusters = new Clusters(nClusters);
   Tracks          * tracks = new Tracks(nTracks);
   Tracks          * allTracks = new Tracks(nTracks * Runs);

   for (Int_t i=0; i<Runs; i++) {
      showDebug("Start getMCClusters\n");
      di->getMCClusters(i, clusters);

      showDebug("Finding calorimeter tracks\n");
      tracks = clusters->findCalorimeterTracksWithMCTruth();

      if (tracks->GetEntriesFast() == 0) breakSignal = kTRUE; // to stop running

      // Track improvements
      Int_t nTracksBefore = 0, nTracksAfter = 0;
      Int_t nIsInelastic = 0, nIsNotInelastic = 0;
      
      tracks->extrapolateToLayer0();
      nTracksBefore = tracks->GetEntries();
      tracks->removeTracksLeavingDetector();
      nTracksAfter = tracks->GetEntries();
      
      cout << "Of " << nTracksBefore << " tracks, " << nTracksBefore - nTracksAfter << " (" << 100* ( nTracksBefore - nTracksAfter) / ( (float) nTracksBefore ) << "%) were lost when leaving the detector.\n";
      
      tracks->removeTrackCollisions();
      // tracks->retrogradeTrackImprovement(clusters);

      tracks->Compress();
      tracks->CompressClusters();
      
      for (Int_t j=0; j<tracks->GetEntriesFast(); j++) {
         if (!tracks->At(j)) continue;

         allTracks->appendTrack(tracks->At(j));
      }

      allTracks->appendClustersWithoutTrack(clusters->getClustersWithoutTrack());

      clusters->clearClusters();
      tracks->Clear();

      if (breakSignal) break;
   }

   delete clusters;
   delete tracks;
   delete di;

   return allTracks;
}