00001 #ifndef ExportPulse_H__
00002 #define ExportPulse_H__
00003
00004 #include <string>
00005 #include <set>
00006 #include <map>
00007 #include <iostream>
00008
00009 #include "definitions.h"
00010 #include "BaseModule.h"
00011 #include "TGlobalData.h"
00012 #include "TSetupData.h"
00013 #include "ModulesOptions.h"
00014 #include "ModulesNavigator.h"
00015 #include "PulseCandidateFinder.h"
00016
00017 class TDirectory;
00018 class TVAnalysedPulseGenerator;
00019 class TPulseIsland;
00020 #include "TAnalysedPulse.h"
00021
00024 class ExportPulse : public BaseModule{
00025 typedef int TPulseIslandID;
00026 typedef int EventID_t;
00027 typedef std::set<TPulseIslandID> PulseIDList_t;
00028 typedef std::map<std::string,PulseIDList_t> ChannelPulseIDs_t;
00029 typedef std::map<EventID_t,PulseIDList_t> EventPulseIDList_t;
00030 typedef std::map<std::string,EventPulseIDList_t> EventChannelPulseIDs_t;
00031 typedef std::set<const TAnalysedPulse*> TAPList_t;
00032 typedef std::map<std::string,TAPList_t> ChannelTAPs_t;
00033
00036 struct PulseInfo_t{
00037 int pulseID;
00038 Long64_t event;
00039 std::string bankname;
00040 std::string detname;
00043 std::string MakeTPIName()const;
00044 };
00045
00046 public:
00047 ExportPulse(modules::options* opts);
00048 ~ExportPulse();
00049
00054 void AddToExportList(const std::string& channel,TPulseIslandID pulse_id);
00055
00060 void AddToExportList(const TAnalysedPulse* pulse);
00061
00069
00073 static ExportPulse* Instance();
00074
00075 private:
00078 virtual int BeforeFirstEntry(TGlobalData* gData, const TSetupData* setup);
00079
00083 virtual int ProcessEntry(TGlobalData *gData, const TSetupData* gSetup);
00084 virtual int AfterLastEntry(TGlobalData* gData,const TSetupData* setup){return 0;};
00085
00087 int DrawTPIs();
00088
00090 int DrawTAPs();
00091
00093 int PlotTPI(const TPulseIsland* pulse, const PulseInfo_t& info);
00094
00095 TH1F* MakeHistTPI(const TPulseIsland* pulse, const std::string& name, int shift=0, int samples=0)const;
00096
00098 int PlotTAP(const TAnalysedPulse* pulse, const PulseInfo_t& info)const;
00100 PulseIslandList* GetTPIsFromDetector(std::string bank="");
00101
00102 void SetCurrentPulseID(const TPulseIslandID& id){fPulseInfo.pulseID=id;};
00103 void SetCurrentEventNumber(const Long64_t& num){fPulseInfo.event=num;};
00104 void SetCurrentDetectorName(const std::string& detector);
00105
00106 Long64_t GetCurrentEventNumber()const{return fPulseInfo.event;};
00107 std::string GetCurrentBankName()const{return fPulseInfo.bankname;};
00108 Long64_t GetTotalNumberOfEvents()const{return fTotalEvents;};
00109 void ClearPulsesToExport();
00110
00111 void AddToConfigRequestList( EventID_t event_id, const std::string& detector,TPulseIslandID pulse_id);
00112 bool ParseEventRequest(std::string input, std::vector<EventID_t>& event_list);
00113 void ShowGuidance();
00114 bool ParsePulseRequest(std::string input, std::vector<EventID_t>& list);
00115 bool ParseRequest(std::string input, std::vector<EventID_t>& list,
00116 const std::string& type, Long64_t lower_limit, Long64_t upper_limit);
00117 void LoadPulsesRequestedByConfig();
00118
00119 private:
00120
00121 bool fGuidanceShown;
00122 Long64_t fTotalEvents;
00123 double fClockTick;
00124 double fTimeShift;
00125 ChannelPulseIDs_t fTPIsToPlot;
00126 ChannelTAPs_t fTAPsToPlot;
00127 EventChannelPulseIDs_t fRequestedByConfig;
00128 PulseInfo_t fPulseInfo;
00129 const TSetupData* fSetup;
00130 modules::options* fOptions;
00131 bool fUsePCF;
00132 PulseCandidateFinder* fPulseFinder;
00133 PulseIslandList fSubPulses;
00134 TDirectory* fTPIDirectory;
00135 TDirectory* fTAPDirectory;
00136
00137 TGlobalData* fGlobalData;
00138
00139 };
00140
00141 inline ExportPulse* ExportPulse::Instance() {
00142 return modules::navigator::Instance()->GetModule<ExportPulse>("ExportPulse");
00143 }
00144
00145 inline void ExportPulse::AddToExportList(const std::string& detector,TPulseIslandID pulse_id) {
00146 fTPIsToPlot[detector].insert(pulse_id);
00147 }
00148
00149 inline void ExportPulse::AddToExportList(const TAnalysedPulse* pulse){
00150 std::string channel=pulse->GetSource().Channel().str();
00151 if(Debug()) std::cout<<"ExportPulse: Asked to draw a TAP for "<<channel<<std::endl;
00152 fTAPsToPlot[channel].insert(pulse);
00153 AddToExportList(channel,pulse->GetParentID());
00154 }
00155
00156 inline void ExportPulse::AddToConfigRequestList(EventID_t event_id, const std::string& detector,TPulseIslandID pulse_id) {
00157 fRequestedByConfig[detector][event_id].insert(pulse_id);
00158 }
00159
00160 inline void ExportPulse::SetCurrentDetectorName(const std::string& detector){
00161 fPulseInfo.detname=detector;
00162 fPulseInfo.bankname=fSetup->GetBankName(detector);
00163 fClockTick = TSetupData::Instance()->GetClockTick(fPulseInfo.bankname);
00164 fTimeShift = TSetupData::Instance()->GetTimeShift(fPulseInfo.bankname);
00165 if(fPulseFinder) fPulseFinder->SetChannel(detector);
00166 }
00167
00168 #endif // ExportPulse_H__