00001
00002 #include <map>
00003 #include <stdlib.h>
00004 #include <string>
00005 #include <set>
00006 #include <list>
00007 #include "TKey.h"
00008 #include <TRint.h>
00009 #include <TKey.h>
00010 #include <TTree.h>
00011 #include <TFile.h>
00012 #include <iostream>
00013 #include <sstream>
00014 #include "tools/Log.hh"
00015 #include "tools/Toolbox.hh"
00016
00017
00018
00019
00020 #include "root/MTEvent.hh"
00021
00022
00023 #include "MicroException.hh"
00024
00025
00026 using namespace std;
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 int main(int argc, char**argv){
00042
00043 if ( argc !=2 ) {
00044 FILE_LOG(logERROR) << "usage: addDifSynchro rootfile" << endl;
00045 exit(1);
00046 }
00047
00048
00049 string rootName;
00050 rootName.assign(argv[1]);
00051 TFile f(rootName.c_str(),"READONLY");
00052 TIter nextkey(f.GetListOfKeys());
00053
00054
00055
00056 TKey *key;
00057 vector<string> slabTreeNames;
00058
00059 TTree *difTree = NULL;
00060 MTEvent *findDifevt = new MTEvent();
00061
00062 while (key = (TKey*)nextkey())
00063 {
00064 TTree* tmp = (TTree*)key->ReadObj();
00065 TBranch *branch= tmp->GetBranch("MTEvent");
00066 branch->SetAddress(&findDifevt);
00067 tmp->GetEntry(0);
00068
00069
00070 if ( findDifevt->GetDifSynchro() > 0 )
00071 {
00072 difTree = tmp;
00073 cout << "Dif tree[" << (tmp->GetName()) << "]"<< endl;
00074 }
00075 else
00076 {
00077 slabTreeNames.push_back(string(tmp->GetName()));
00078 }
00079
00080 }
00081 delete findDifevt;
00082
00083
00084
00085
00086 if ( difTree == NULL ) { cout << "Could not find DIF SYNCRO TTRee! "<< endl; exit(-1); }
00087 vector<ULong64_t> difSynchro;
00088 MTEvent *difEvt = new MTEvent();
00089 difTree->SetBranchAddress("MTEvent", &difEvt);
00090 for ( int eventNum =0 ; eventNum < difTree->GetEntries() ; eventNum++ )
00091 {
00092 difTree->GetEntry(eventNum);
00093 difSynchro.push_back(difEvt->GetDifSynchro());
00094 }
00095 delete difEvt;
00096
00097 string mergeFileName = rootName.substr(0,rootName.find("root")-1)+"_DS.root";
00098 TFile *newFile = new TFile(mergeFileName.c_str(), "RECREATE");
00099 newFile->cd();
00100
00101
00102 TTree* mergedTree = NULL;
00103 for(vector<string>::iterator slabNameIt=slabTreeNames.begin(); slabNameIt!=slabTreeNames.end(); slabNameIt++)
00104 {
00105
00106 TTree* readTree = (TTree*)f.Get((*slabNameIt).c_str());
00107 if ( readTree->GetEntries() != difTree->GetEntries() ) { cout << "nb entries differ !!!" << endl; exit(0); }
00108
00109 FILE_LOG(logINFO ) << "Add Dif Synchro to TTree[" << readTree->GetName() << "]" <<endl;
00110 mergedTree = readTree->CloneTree(0);
00111
00112
00113 MTEvent *readEvt = new MTEvent();
00114 readTree->SetBranchAddress("MTEvent",&readEvt);
00115
00116 for ( int eventNum =0 ; eventNum < readTree->GetEntries() ; eventNum++ )
00117 {
00118 readTree->GetEntry(eventNum);
00119 readEvt->SetDifSynchro(difSynchro[eventNum]);
00120 mergedTree->Fill();
00121 if ( eventNum % 100 == 0)
00122 {
00123 FILE_LOG(logINFO ) << "Done for entry " << eventNum << " / " << readTree->GetEntries() << " \r" << flush;
00124 }
00125
00126 }
00127 delete readEvt;
00128 mergedTree->Write("", TObject::kOverwrite);
00129 }
00130
00131
00132 newFile->Close();
00133 FILE_LOG(logINFO ) << endl << "Done." << endl;
00134
00135 }