-void AliMCEventHandler::ReorderAndExpandTreeTR()
-{
-//
-// Reorder and expand the track reference tree in order to match the kinematics tree.
-// Copy the information from different branches into one
-//
-// TreeTR
-
- fTmpFileTR = new TFile("TrackRefsTmp.root", "recreate");
- fTmpTreeTR = new TTree("TreeTR", "TrackReferences");
- if (!fTrackReferences) fTrackReferences = new TClonesArray("AliTrackReference", 100);
- fTmpTreeTR->Branch("TrackReferences", "TClonesArray", &fTrackReferences, 32000, 0);
-
-
-//
-// Activate the used branches only. Otherwisw we get a bad memory leak.
- fTreeTR->SetBranchStatus("*", 0);
- fTreeTR->SetBranchStatus("AliRun.*", 1);
- fTreeTR->SetBranchStatus("ITS.*", 1);
- fTreeTR->SetBranchStatus("TPC.*", 1);
- fTreeTR->SetBranchStatus("TRD.*", 1);
- fTreeTR->SetBranchStatus("TOF.*", 1);
- fTreeTR->SetBranchStatus("FRAME.*", 1);
- fTreeTR->SetBranchStatus("MUON.*", 1);
-//
-// Connect the active branches
- TClonesArray* trefs[7];
- for (Int_t i = 0; i < 7; i++) trefs[i] = 0;
- if (fTreeTR){
- // make branch for central track references
- if (fTreeTR->GetBranch("AliRun")) fTreeTR->SetBranchAddress("AliRun", &trefs[0]);
- if (fTreeTR->GetBranch("ITS")) fTreeTR->SetBranchAddress("ITS", &trefs[1]);
- if (fTreeTR->GetBranch("TPC")) fTreeTR->SetBranchAddress("TPC", &trefs[2]);
- if (fTreeTR->GetBranch("TRD")) fTreeTR->SetBranchAddress("TRD", &trefs[3]);
- if (fTreeTR->GetBranch("TOF")) fTreeTR->SetBranchAddress("TOF", &trefs[4]);
- if (fTreeTR->GetBranch("FRAME")) fTreeTR->SetBranchAddress("FRAME", &trefs[5]);
- if (fTreeTR->GetBranch("MUON")) fTreeTR->SetBranchAddress("MUON", &trefs[6]);
- }
-
- Int_t np = fStack->GetNprimary();
- Int_t nt = fTreeTR->GetEntries();
-
- //
- // Loop over tracks and find the secondaries with the help of the kine tree
- Int_t ifills = 0;
- Int_t it = 0;
- Int_t itlast = 0;
- TParticle* part;
-
- for (Int_t ip = np - 1; ip > -1; ip--) {
- part = fStack->Particle(ip);
-// printf("Particle %5d %5d %5d %5d %5d %5d \n",
-// ip, part->GetPdgCode(), part->GetFirstMother(), part->GetFirstDaughter(),
-// part->GetLastDaughter(), part->TestBit(kTransportBit));
-
- // Determine range of secondaries produced by this primary during transport
- Int_t dau1 = part->GetFirstDaughter();
- if (dau1 < np) continue; // This particle has no secondaries produced during transport
- Int_t dau2 = -1;
- if (dau1 > -1) {
- Int_t inext = ip - 1;
- while (dau2 < 0) {
- if (inext >= 0) {
- part = fStack->Particle(inext);
- dau2 = part->GetFirstDaughter();
- if (dau2 == -1 || dau2 < np) {
- dau2 = -1;
- } else {
- dau2--;
- }
- } else {
- dau2 = fStack->GetNtrack() - 1;
- }
- inext--;
- } // find upper bound
- } // dau2 < 0
-
-
-// printf("Check (1) %5d %5d %5d %5d %5d \n", ip, np, it, dau1, dau2);
-//
-// Loop over reference hits and find secondary label
-// First the tricky part: find the entry in treeTR than contains the hits or
-// make sure that no hits exist.
-//
- Bool_t hasHits = kFALSE;
- Bool_t isOutside = kFALSE;
-
- it = itlast;
- while (!hasHits && !isOutside && it < nt) {
- fTreeTR->GetEntry(it++);
- for (Int_t ib = 0; ib < 7; ib++) {
- if (!trefs[ib]) continue;
- Int_t nh = trefs[ib]->GetEntries();
- for (Int_t ih = 0; ih < nh; ih++) {
- AliTrackReference* tr = (AliTrackReference*) trefs[ib]->At(ih);
- Int_t label = tr->Label();
- if (label >= dau1 && label <= dau2) {
- hasHits = kTRUE;
- itlast = it - 1;
- break;
- }
- if (label > dau2 || label < ip) {
- isOutside = kTRUE;
- itlast = it - 1;
- break;
- }
- } // hits
- if (hasHits || isOutside) break;
- } // branches
- } // entries
-
- if (!hasHits) {
- // Write empty entries
- for (Int_t id = dau1; (id <= dau2); id++) {
- fTmpTreeTR->Fill();
- ifills++;
- }
- } else {
- // Collect all hits
- fTreeTR->GetEntry(itlast);
- for (Int_t id = dau1; (id <= dau2) && (dau1 > -1); id++) {
- for (Int_t ib = 0; ib < 7; ib++) {
- if (!trefs[ib]) continue;
- Int_t nh = trefs[ib]->GetEntries();
- for (Int_t ih = 0; ih < nh; ih++) {
- AliTrackReference* tr = (AliTrackReference*) trefs[ib]->At(ih);
- Int_t label = tr->Label();
- // Skip primaries
- if (label == ip) continue;
- if (label > dau2 || label < dau1)
- printf("AliMCEventHandler::Track Reference Label out of range !: %5d %5d %5d %5d \n",
- itlast, label, dau1, dau2);
- if (label == id) {
- // secondary found
- tr->SetDetectorId(ib-1);
- Int_t nref = fTrackReferences->GetEntriesFast();
- TClonesArray &lref = *fTrackReferences;
- new(lref[nref]) AliTrackReference(*tr);
- }
- } // hits
- } // branches
- fTmpTreeTR->Fill();
- fTrackReferences->Clear();
- ifills++;
- } // daughters
- } // has hits
- } // tracks
-
- //
- // Now loop again and write the primaries
- //
- it = nt - 1;
- for (Int_t ip = 0; ip < np; ip++) {
- Int_t labmax = -1;
- while (labmax < ip && it > -1) {
- fTreeTR->GetEntry(it--);
- for (Int_t ib = 0; ib < 7; ib++) {
- if (!trefs[ib]) continue;
- Int_t nh = trefs[ib]->GetEntries();
- //
- // Loop over reference hits and find primary labels
- for (Int_t ih = 0; ih < nh; ih++) {
- AliTrackReference* tr = (AliTrackReference*) trefs[ib]->At(ih);
- Int_t label = tr->Label();
- if (label < np && label > labmax) {
- labmax = label;
- }
-
- if (label == ip) {
- tr->SetDetectorId(ib-1);
- Int_t nref = fTrackReferences->GetEntriesFast();
- TClonesArray &lref = *fTrackReferences;
- new(lref[nref]) AliTrackReference(*tr);
- }
- } // hits
- } // branches
- } // entries
- it++;
- fTmpTreeTR->Fill();
- fTrackReferences->Clear();
- ifills++;
- } // tracks
- // Check
-
-
- // Clean-up
- delete fTreeTR; fTreeTR = 0;
-
- for (Int_t ib = 0; ib < 7; ib++) {
- if (trefs[ib]) {
- trefs[ib]->Clear();
- delete trefs[ib];
- trefs[ib] = 0;
- }
- }
-
- if (ifills != fStack->GetNtrack())
- printf("AliMCEventHandler:Number of entries in TreeTR (%5d) unequal to TreeK (%5d) \n",
- ifills, fStack->GetNtrack());
-
- fTmpTreeTR->Write();
- fTreeTR = fTmpTreeTR;
-}