ROOT logo
void addObjectAndUpdateAOD(const char *fileName = "AliAOD.root") {
  // This little macro takes an already created AOD file and adds
  // a new branch to it.
  // You need write access to the AOD file, which is generally not 
  // the case for AOD files available on the GRID/on CAF.
  // Be aware that if something breaks (lost connection, node goes 
  // down, ...) the content of the file will be essentially lost, 
  // meaning: 
  // WITH THIS UPDATE PROCEDURE YOU HAVE THE POWER TO DESTROY DATA!
  //
  // 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 inFile(fileName, "UPDATE");

  TTree *aodTree = (TTree*)inFile.Get("aodTree");
  AliAODEvent *ev = new AliAODEvent();
  ev->ReadFromTree(aodTree);

  // add new information to the list (we use AliESDtracks as an example)
  TClonesArray *tracks = new TClonesArray("AliESDtrack", 0);
  ev->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 = aodTree->Branch(name, &tracks); // the branch gets the same name

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

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

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

    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();
  }

  // (over)write the tree (to the same file!)

  aodTree->Write("", TObject::kOverwrite);
  inFile.Close();

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