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