00001 #include "EventNavigator.h"
00002 #include "LoadPulses.h"
00003 #include "RegisterModule.inc"
00004 #include "TGlobalData.h"
00005 #include "TSetupData.h"
00006 #include "ModulesOptions.h"
00007 #include "definitions.h"
00008 #include "TAnalysedPulse.h"
00009 #include "debug_tools.h"
00010
00011 #include "TFile.h"
00012 #include "TTree.h"
00013 #include "TClonesArray.h"
00014 #include "TBranchClones.h"
00015
00016 #include <iostream>
00017 #include <utility>
00018 using std::cout;
00019 using std::endl;
00020
00021 extern SourceAnalPulseMap gAnalysedPulseMap;
00022
00023 LoadPulses::LoadPulses(modules::options* opts):
00024 BaseModule("LoadPulses",opts){
00025 fFileName=opts->GetString("file_name");
00026 fTreeName=opts->GetString("tree_name","TAP_tree");
00027 }
00028
00029 LoadPulses::~LoadPulses(){
00030 }
00031
00032 int LoadPulses::BeforeFirstEntry(TGlobalData* gData,const TSetupData *setup){
00033
00034 if(fFileName.empty()){
00035 cout<<"LoadPulses: Error: no input file specified "<<endl;
00036 return 1;
00037 }
00038 TFile* inFile=TFile::Open(fFileName.c_str(), "READ");
00039 if(!inFile){
00040 cout<<"LoadPulses: Error: Unable to open input file, "<<fFileName<<endl;
00041 return 2;
00042 }
00043
00044 inFile->GetObject(fTreeName.c_str(),fInTree);
00045 if(!fInTree){
00046 cout<<"LoadPulses: Error: Unable to find input tree, "<<fTreeName<<" in file "<<fFileName<<endl;
00047 return 3;
00048 }
00049
00050 FlyWeight<IDs::source,TAnalysedPulse::Tag>::LoadProxyList(gDirectory,"TAP_sources");
00051
00052
00053 TObjArray* listOfArraysOfTAPs=fInTree->GetListOfBranches();
00054 TBranchClones* branch;
00055 IDs::source tmp_source;
00056 for(int i_array=0;i_array<listOfArraysOfTAPs->GetSize();i_array++){
00057
00058 branch=(TBranchClones*)listOfArraysOfTAPs->At(i_array);
00059 if(!branch) continue;
00060
00061 tmp_source=branch->GetName();
00062
00063 fBranches.push_back(std::make_pair(tmp_source,branch));
00064
00065 gAnalysedPulseMap[tmp_source];
00066 }
00067 for(BranchList::iterator i_branch=fBranches.begin();
00068 i_branch!=fBranches.end(); ++i_branch){
00069
00070 i_branch->second->SetAddress(&fArrays[i_branch->first]);
00071 }
00072
00073
00074
00075 fCurrentEntry=EventNavigator::Instance().GetStartEntry();
00076 fNumEntries=fInTree->GetEntries();
00077 return 0;
00078 }
00079
00080 int LoadPulses::ProcessEntry(TGlobalData* gData,const TSetupData *setup){
00081 if(fCurrentEntry>fNumEntries){
00082 cout<<"LoadPulses: Error: input file contains no more entries so I'm stopping the run"<<endl;
00083 return 1;
00084 }
00085
00086 fInTree->GetEntry(fCurrentEntry);
00087 int n_entries=0;
00088 SourceAnalPulseMap::iterator i_output;
00089 AnalysedPulseList* pulseList;
00090 for(SourceToClonesArrayMap::iterator i_array=fArrays.begin();
00091 i_array!=fArrays.end(); ++i_array){
00092
00093 i_output=gAnalysedPulseMap.find(i_array->first);
00094 if(i_output==gAnalysedPulseMap.end()){
00095 cout<<"LoadPulses: Error: gAnalysedPulseMap doesn't contain a pulse list for "<<i_array->first<<endl;
00096 return 1;
00097 }
00098 pulseList=&i_output->second;
00099
00100
00101 n_entries=i_array->second->GetEntries();
00102 TAnalysedPulse* pulse;
00103 for(int i_pulse=0;i_pulse<n_entries;++i_pulse){
00104 pulse=(TAnalysedPulse*)(i_array->second->At(i_pulse));
00105 pulseList->push_back(pulse);
00106 }
00107 }
00108
00109
00110
00111
00112
00113 ++fCurrentEntry;
00114 return 0;
00115 }
00116
00117 int LoadPulses::AfterLastEntry(TGlobalData* gData,const TSetupData *setup){
00118 return 0;
00119 }
00120
00121 ALCAP_REGISTER_MODULE(LoadPulses,file_name,tree_name);