00001 #ifndef EVENTNAVIGATOR_H
00002 #define EVENTNAVIGATOR_H
00003
00004
00005
00006 #include <stdexcept>
00007 #undef DEFER
00008
00009 class TFile;
00010 class TTree;
00011
00012
00013 #include "definitions.h"
00014 #include "TGlobalData.h"
00015 #include "BankIter.h"
00016 #include "SetupRecord.h"
00017 #include "LoopSequence.h"
00018
00019
00021 class io_error : public std::runtime_error {
00022 public:
00023 io_error()
00024 : std::runtime_error("I/O failed")
00025 {}
00026 };
00027
00028
00029 class ARGUMENTS;
00030
00031
00039
00040 class EventNavigator {
00041 typedef IDs::channel ChannelID;
00042 typedef IDs::generator GeneratorID;
00043 typedef IDs::source SourceID;
00044 typedef IDs::Generator_t GeneratorStr;
00045 typedef IDs::Config_t Config;
00046
00047
00048 public:
00049 enum OutputMode {kNew = 0, kOverwrite };
00050
00051
00052 static EventNavigator& InitInstance(const ARGUMENTS& command_line);
00053
00056 static EventNavigator& Instance();
00057
00058 ~EventNavigator(){}
00059
00062 const TSetupData* const GetSetupData() {return fSetupData;}
00063
00066 static const SetupRecord& GetSetupRecord() {return *Instance().fSetupRecord;}
00067
00070 const LoopSequence& GetLoopSequence() const;
00071
00072 const char* GetOutputFileName()const;
00073
00077 const LoopSequence& MakeLoopSequence(const ARGUMENTS& args);
00078
00082 Bool_t ConnectInput(const char* input_name);
00083
00084
00088 Bool_t ConnectOutput(const char* output_name, OutputMode mode = kOverwrite);
00089
00092 Bool_t ConnectOutputFile(const char* output_file_name, Bool_t append =false);
00093
00095 Long64_t EntryNo() const {return fEntryNo;}
00096
00099 Long64_t GetInputNEntries() const {return fRawTree->GetEntriesFast();}
00100
00102 Long64_t GetStartEntry() const;
00103
00105 Long64_t GetStopEntry() const;
00106
00109 Long64_t GetLoopNEntries() const
00110 { return GetStopEntry() - GetStartEntry(); }
00111
00112
00116 inline Int_t NextEntry() {
00117 return LoadEntry(fEntryNo + 1);
00118 }
00119
00123 inline Int_t GetEntry(Long64_t entry){
00124 return LoadEntry(entry);
00125 }
00126
00127
00128 Int_t WriteCurrentEntry();
00129
00132 void SetSavePulseIslands(bool save = 1){fCopyRaw =save;};
00133
00137 void Adopt(PulseIslandList& pil, const SourceID& sid);
00138 void Adopt(AnalysedPulseList& apl, const SourceID& sid);
00139 void Adopt(DetectorPulseList& dpl, const SourceID& sid);
00140
00142 void Adopt(PulseIslandList& pil, const ChannelID& cid);
00143
00144
00147 void AdoptTemporary(PulseIslandList& pil, const SourceID& sid);
00148 void AdoptTemporary(AnalysedPulseList& apl, const SourceID& sid);
00149 void AdoptTemporary(DetectorPulseList& dpl, const SourceID& sid);
00150
00152 void AdoptTemporary(PulseIslandList& pil, const ChannelID& cid);
00153
00154 #ifdef DEFER
00157 const PulseIslandList& FindIslandBank(const SourceID& sid) const;
00158 const PulseIslandList& FindAnalysedBank(const SourceID& sid) const;
00159 const PulseIslandList& FindDetectorBank(const SourceID& sid) const;
00160 #endif
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00183 PulseIslandBankIter MatchIslandBanks(const SourceID& sid) const;
00184 PulseIslandBankIter MatchAnalysedBanks(const SourceID& sid) const;
00185 PulseIslandBankIter MatchDetectorBanks(const SourceID& sid) const;
00186
00187 PulseIslandBankIter MatchIslandBanks(const ChannelID& cid,
00188 GeneratorStr gid ="") const;
00189
00190 AnalysedPulseBankIter MatchAnalysedBanks(const ChannelID& cid,
00191 GeneratorStr gid ="") const;
00192
00193 AnalysedPulseBankIter MatchDetectorBanks(const ChannelID& cid,
00194 GeneratorStr gid ="") const;
00195
00196 void Close();
00197
00198 TGlobalData* GetRawData()const {return fRawData;}
00199 TTree* GetRawTree()const {return fRawTree;}
00200 void DumpRawTree()const;
00201
00202 protected:
00205 TGlobalData* ConnectRawData(TFile* raw_file);
00206
00209 Bool_t VerifyRawData(TTree* raw_tree);
00210
00214 TSetupData* ConnectSetupData(TFile* raw_file);
00215
00218 Bool_t VerifySetupData(TTree* setup_tree);
00219
00220
00222 Bool_t MirrorRawInputFormat();
00223
00225 Int_t LoadEntry(Long64_t entry);
00226
00227
00228 private:
00229 EventNavigator();
00230 EventNavigator(const ARGUMENTS& command_line);
00231 EventNavigator(const EventNavigator& src){};
00232 EventNavigator& operator=(const EventNavigator& rhs){return *this;}
00233
00234 static EventNavigator* fInstance;
00235
00236 Bool_t fCopyRaw;
00237
00239 TFile* fRawInput;
00240
00242 TFile* fOutput;
00243
00245 Int_t fEntryNo;
00246
00248 TTree* fRawTree;
00249
00251 TTree* fSetupTree;
00252
00254 TTree* fEventTree;
00255
00256 TTree* fOutputTreeTPI;
00257
00258 TGlobalData* fRawData;
00259
00260 TSetupData* fSetupData;
00261
00262 SetupRecord* fSetupRecord;
00263
00264 LoopSequence* fLoopSequence;
00265
00266
00267 };
00268
00269
00270
00271
00272 #endif //EVENTNAVIGATOR_H
00273
00274
00275
00276
00277