Hi, I'm looking for a simple way to keep a one to one correspondence between a file in a TChain and an output file generated from the TChain. Here is the application: 1) I have a TTree called DataTree with branches representing data. 2) I want to resimulate part of the DataTree and write it into another TTree called SimTree, storing the results in a separate file. 3) Later, the analysis code will loop over both DataTree and SimTree on an event by event basis (using TFriend) and make comparisons. The above steps are straight forward. The complicated parts are : 1) DataTree is stored in a chain of multiple files. 2) I want to keep a one-to-one correspondence between the number of files in DataTree and SimTree. This is to avoid confusion when the user loops over different sets of files when they are simulating as compared to when they are analyzing. It seems like the way to do this is something like this (excuse my sloppy pseudo-code) : 1) Loop through DataTree to simulate SimTree, and for each event save the name of each filename that is encountered in DataTree by something like: oldfile = DataTree->GetCurrentFile()->GetName() 2) At the start of each event, check whether a new file has been opened with if (DataTree->GetCurrentFile()->GetName() != oldfile) call method SwitchFile() 3) Run a SwitchFile method to close the SimTree file, open a new one, and add a construction for a new tree - something like this : SwitchFile() { // store structure of SimTree // follow example at : http://root.cern.ch/root/html/src/TTree.cxx.html#TTree:ChangeFile MySimFile->Write(); MySimFile->Close(); char newDatafile[100] = DataTree->GetCurrentFile()->GetName(); char newSimFile[104]; sprintf(newSimFile,"sim.%s",&newDataFile[0]); MySimFile = new TFile(newSimFile,"WRITE"); TTree *SimTree = new TTree("SimTree","simulated tree"); // remake structure of SimTree and store in MySimFile // follow example at : http://root.cern.ch/root/html/src/TTree.cxx.html#TTree:ChangeFile } Is there a better way to do this ? Ideally, I think this would be fairly easy if in the code there was a : TChain::SwitchFile() method which was called whenever a file was closed and a new one opened, and a new ChangeFile method where you could specify the new file name, as in TTree::ChangeFile(TTree *file, TString *newFileName). Thanks, Ben
This archive was generated by hypermail 2b29 : Sun Jan 02 2005 - 05:50:06 MET