00001 #include "TDPGeneratorFactory.h"
00002 #include "MaxTimeDiffDPGenerator.h"
00003 #include <iostream>
00004 #include <vector>
00005 #include <cmath>
00006 #include "debug_tools.h"
00007 using std::cout;
00008 using std::endl;
00009
00010 MaxTimeDiffDPGenerator::MaxTimeDiffDPGenerator(TDPGeneratorOptions* opts):
00011 TVDetectorPulseGenerator("MaxTimeDiff",opts),fTimeDifference(0.1){
00012 fTimeDifference=opts->GetDouble("time_difference",fTimeDifference);
00013 }
00014
00015 int MaxTimeDiffDPGenerator::ProcessPulses( DetectorPulseList& output){
00016
00017 if(!SlowPulseList()) {
00018 cout<<"Error: No pulse list for slow channel, "<<GetFastSource()<<" with MaxTimeDiffDPGenerator"<<endl;
00019 return 1;
00020 } else if(!FastPulseList()) {
00021 cout<<"Error: No pulse list for fast channel, "<<GetSlowSource()<<" with MaxTimeDiffDPGenerator"<<endl;
00022 return 2;
00023 }
00024
00025 AnalysedPulseList::const_iterator fastPulseIter = FastPulseList()->begin();
00026 AnalysedPulseList::const_iterator slowPulseIter = SlowPulseList()->begin();
00027 AnalysedPulseList::const_iterator finalFastPulseIter = FastPulseList()->end();
00028 AnalysedPulseList::const_iterator finalSlowPulseIter = SlowPulseList()->end();
00029
00030 std::vector< std::pair<
00031 AnalysedPulseList::const_iterator,
00032 AnalysedPulseList::const_iterator> > pulseIters;
00033 pulseIters.push_back(std::make_pair(fastPulseIter,finalFastPulseIter));
00034 pulseIters.push_back(std::make_pair(slowPulseIter,finalSlowPulseIter));
00035
00036
00037
00038 double min_time = 999999;
00039 double pulse_time;
00040
00041 int fast_pulse, slow_pulse;
00042 while (pulseIters.size() > 0) {
00043 fast_pulse=-1.;
00044 slow_pulse=-1.;
00045 min_time = 999999e9;
00046
00047
00048 for (unsigned int b = 0; b < pulseIters.size(); ++b) {
00049 pulse_time = (*pulseIters.at(b).first)->GetTime() * 1e-6;
00050 min_time = std::min(min_time, pulse_time);
00051
00052 }
00053
00054
00055 for (unsigned int b = 0; b < pulseIters.size(); ++b) {
00056
00057 TAnalysedPulse* pulse = *(pulseIters[b].first);
00058 double pulse_time = pulse->GetTime() * 1e-6;
00059
00060 if (std::fabs(pulse_time - min_time) < fTimeDifference) {
00061 if ( pulse->GetSource().isFast()) {
00062 if(Debug()) cout<<"Fast? " << pulse->GetSource().str() << std::endl;
00063 fast_pulse = pulseIters[b].first - FastPulseList()->begin();
00064 } else if ( pulse->GetSource().isSlow()) {
00065 if(Debug()) cout<<"Slow? " << pulse->GetSource().str() << std::endl;
00066 slow_pulse = pulseIters[b].first - SlowPulseList()->begin();
00067 }
00068
00069 ++(pulseIters[b].first);
00070 }
00071 }
00072 TDetectorPulse* det_pulse = MakeTDP( fast_pulse, slow_pulse);
00073 if(det_pulse){
00074 output.push_back(det_pulse);
00075 if(Debug()){
00076 cout<<"Created a TDetectorPulse with:\n";
00077 cout<<"Fast Pulse: " << det_pulse->GetTime(TDetectorPulse::kFast) * 1e-6 << std::endl;
00078 cout<< "Slow Pulse: " << det_pulse->GetTime(TDetectorPulse::kSlow) * 1e-6 << std::endl;
00079 cout<< std::endl;
00080 }
00081 }
00082
00083
00084
00085 for (int b = pulseIters.size()-1; b >= 0; --b) {
00086 if (pulseIters[b].first == pulseIters[b].second){
00087 pulseIters.erase(pulseIters.begin() + b);
00088 }
00089 }
00090 }
00091 return 0;
00092 }
00093
00094 ALCAP_TDP_GENERATOR(MaxTimeDiff,time_difference);