/data3/calcul/jacquem/working_dir/Micromegas/micromegasFrameWork/src/analyse/root/addDifSynchro.cpp

Go to the documentation of this file.
00001 /* @version $Revision: 1566 $ * @modifiedby $Author: jacquem $ * @lastmodified $Date: 2012-03-08 14:00:10 +0100 (Thu, 08 Mar 2012) $ */
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 //#include "root/MTRun.hh"
00019 //#include "root/MTChannel.hh"
00020 #include "root/MTEvent.hh"
00021 
00022 
00023 #include "MicroException.hh"
00024 
00025 
00026 using namespace std;
00027 
00028 /*
00029   !!! ATTENTION  Le fichier root en entree doit contentir uniquement 2 TTree dont un etant un fichier DifSynchro
00030   -- Trouver le TTree contenant les info DIF_SYNCHRO
00031   -- Remplir un vector contenant les donneees dif_synchro ( car il est impossible de lire un donnee d'un TTree pendant que l'on Fill un autre)
00032 
00033   -- cloner le TTree Slab 
00034   -- Ajouter l'information Dif_Synchro
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     // Get root file name from command arguments and open it
00049     string rootName;
00050     rootName.assign(argv[1]);
00051     TFile f(rootName.c_str(),"READONLY");
00052     TIter nextkey(f.GetListOfKeys());
00053 
00054 
00055     // Recherche du TTree Dif_synchro
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         // Si DifSynchro > 0 c'est un fichier DIF SYNCHRO
00070         if (  findDifevt->GetDifSynchro() > 0 )
00071         {
00072            difTree = tmp;
00073            cout << "Dif tree[" << (tmp->GetName()) << "]"<< endl;
00074         }
00075         else
00076         { // SINON C'EST UN FICHIER SLAB 
00077           slabTreeNames.push_back(string(tmp->GetName()));
00078         }
00079         
00080     }
00081     delete findDifevt;
00082 
00083 
00084 
00085     // Fill DifSynchro vector
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     // Set the Dif_Syncho parameter
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 }

Generated on Mon Jan 7 13:15:21 2013 for MicromegasFramework by  doxygen 1.4.7