ROOT logo
void cloneAODTreeAndAddObject(const char *newFileName = "AliAOD_new.root", const char *orgFileName = "AliAOD.root") {
  // This little macro takes an already created AOD file and clones it.
  // After adding a new brach, the new TTree is written to a new file.
  //
  // To read back this data (including the newly updated branch), have
  // a look at $ALICE_ROOT/STEER/ReadAOD.C and add one line
  //       TClonesArray *esdTracks = 
  //            (TClonesArray*)ev->GetList()->FindObject("esdTracks");
  // after   
  //       ev->ReadFromTree(aodTree);
  //
  // esdTracks will be 'filled' correctly after each call of
  //       aodTree->GetEvent(nEv);
  //


  // open input file and get the TTree
  TFile orgFile(orgFileName, "READ");
  // get original TTree
  TTree *orgAodTree = (TTree*)orgFile.Get("aodTree");

  // open new output file
  TFile *newFile = new TFile(newFileName, "RECREATE");
  // clone old TTree
  TTree *newAodTree = orgAodTree->CloneTree();

  // do your gymnastics with the new TTree
  AliAODEvent *evNew = new AliAODEvent();
  evNew->ReadFromTree(newAodTree);
    
  // add new information to the list (we use AliESDtracks as an example)
  TClonesArray *tracks = new TClonesArray("AliESDtrack", 0);
  evNew->AddObject(tracks); // add new object to the list

  // define a unique name
  const char *name = "esdTracks";
  tracks->SetName(name); // set this name to be the name of the TClonesArray
  // create the new branch
  TBranch *newBranch = newAodTree->Branch(name, &tracks); // the branch gets the same name

  // loop over events
  Int_t nEvent = newAodTree->GetEntries();

  for(Int_t iEv = 0; iEv < nEvent; iEv++) {

    /*
    // read events (only necessary if you want to access the old data)
    newAodTree->GetEvent(iEv);
    */

    tracks->Delete(); // for each event delete old entries of new TClonesArray

    Int_t nTracks = gRandom->Rndm() * 50; // randomize size of TClonesArray (just for this example)
    tracks->Expand(nTracks); // expand container (just for speed)
    
    // fill TClonesArray
    TClonesArray &rTracks = *tracks;
    for (Int_t iTr = 0; iTr< nTracks; iTr++) {
      new(rTracks[iTr]) AliESDtrack();
    }
    
    // fill the new branch
    newBranch->Fill();
  }

  // delete old and write new UserInfo
  newAodTree->GetUserInfo()->Clear();
  newAodTree->GetUserInfo()->Add(evNew);

  // write new TTree to file
  newAodTree->Write();

  // close files
  newFile->Close();
  delete newFile;

  orgFile.Close();
}
 cloneAODTreeAndAddObject.C:1
 cloneAODTreeAndAddObject.C:2
 cloneAODTreeAndAddObject.C:3
 cloneAODTreeAndAddObject.C:4
 cloneAODTreeAndAddObject.C:5
 cloneAODTreeAndAddObject.C:6
 cloneAODTreeAndAddObject.C:7
 cloneAODTreeAndAddObject.C:8
 cloneAODTreeAndAddObject.C:9
 cloneAODTreeAndAddObject.C:10
 cloneAODTreeAndAddObject.C:11
 cloneAODTreeAndAddObject.C:12
 cloneAODTreeAndAddObject.C:13
 cloneAODTreeAndAddObject.C:14
 cloneAODTreeAndAddObject.C:15
 cloneAODTreeAndAddObject.C:16
 cloneAODTreeAndAddObject.C:17
 cloneAODTreeAndAddObject.C:18
 cloneAODTreeAndAddObject.C:19
 cloneAODTreeAndAddObject.C:20
 cloneAODTreeAndAddObject.C:21
 cloneAODTreeAndAddObject.C:22
 cloneAODTreeAndAddObject.C:23
 cloneAODTreeAndAddObject.C:24
 cloneAODTreeAndAddObject.C:25
 cloneAODTreeAndAddObject.C:26
 cloneAODTreeAndAddObject.C:27
 cloneAODTreeAndAddObject.C:28
 cloneAODTreeAndAddObject.C:29
 cloneAODTreeAndAddObject.C:30
 cloneAODTreeAndAddObject.C:31
 cloneAODTreeAndAddObject.C:32
 cloneAODTreeAndAddObject.C:33
 cloneAODTreeAndAddObject.C:34
 cloneAODTreeAndAddObject.C:35
 cloneAODTreeAndAddObject.C:36
 cloneAODTreeAndAddObject.C:37
 cloneAODTreeAndAddObject.C:38
 cloneAODTreeAndAddObject.C:39
 cloneAODTreeAndAddObject.C:40
 cloneAODTreeAndAddObject.C:41
 cloneAODTreeAndAddObject.C:42
 cloneAODTreeAndAddObject.C:43
 cloneAODTreeAndAddObject.C:44
 cloneAODTreeAndAddObject.C:45
 cloneAODTreeAndAddObject.C:46
 cloneAODTreeAndAddObject.C:47
 cloneAODTreeAndAddObject.C:48
 cloneAODTreeAndAddObject.C:49
 cloneAODTreeAndAddObject.C:50
 cloneAODTreeAndAddObject.C:51
 cloneAODTreeAndAddObject.C:52
 cloneAODTreeAndAddObject.C:53
 cloneAODTreeAndAddObject.C:54
 cloneAODTreeAndAddObject.C:55
 cloneAODTreeAndAddObject.C:56
 cloneAODTreeAndAddObject.C:57
 cloneAODTreeAndAddObject.C:58
 cloneAODTreeAndAddObject.C:59
 cloneAODTreeAndAddObject.C:60
 cloneAODTreeAndAddObject.C:61
 cloneAODTreeAndAddObject.C:62
 cloneAODTreeAndAddObject.C:63
 cloneAODTreeAndAddObject.C:64
 cloneAODTreeAndAddObject.C:65
 cloneAODTreeAndAddObject.C:66
 cloneAODTreeAndAddObject.C:67
 cloneAODTreeAndAddObject.C:68
 cloneAODTreeAndAddObject.C:69
 cloneAODTreeAndAddObject.C:70
 cloneAODTreeAndAddObject.C:71
 cloneAODTreeAndAddObject.C:72
 cloneAODTreeAndAddObject.C:73
 cloneAODTreeAndAddObject.C:74
 cloneAODTreeAndAddObject.C:75
 cloneAODTreeAndAddObject.C:76
 cloneAODTreeAndAddObject.C:77
 cloneAODTreeAndAddObject.C:78
 cloneAODTreeAndAddObject.C:79