00001 #include "MakeTemplate.h"
00002 #include "utils/HistogramFitFCN.h"
00003 #include "PulseTemplate.h"
00004 #include "PrePulse.h"
00005
00006 #include <iostream>
00007 #include <cmath>
00008 #include <string>
00009 #include <vector>
00010 #include <map>
00011
00012 #include "TH1.h"
00013 #include "TFile.h"
00014
00015 MakeTemplate::MakeTemplate(char *HistogramDirectoryName) :
00016 BaseModule(HistogramDirectoryName)
00017 {
00018 fTemplateFile = new TFile("template.root", "RECREATE");
00019 gDirectory->cd("/");
00020 }
00021
00022 MakeTemplate::~MakeTemplate(){
00023 std::map<std::string, PulseTemplate*>::iterator iTemplate;
00024 for (iTemplate = fTemplates.begin(); iTemplate != fTemplates.end(); ++iTemplate) {
00025 if (iTemplate->second) {
00026 iTemplate->second->Save(fTemplateFile);
00027 delete iTemplate->second;
00028 iTemplate->second = NULL;
00029 }
00030 }
00031 fTemplates.clear();
00032 fTemplateFile->Close();
00033 delete fTemplateFile;
00034 }
00035
00036 int MakeTemplate::ProcessEntry(TGlobalData *gData, const TSetupData* gSetup) {
00037
00038 std::map< std::string, std::vector<TPulseIsland*> >& detPulses = gData->fPulseIslandToChannelMap;
00039 std::map< std::string, std::vector<TPulseIsland*> >::iterator iDetPulses;
00040
00041 for (iDetPulses = detPulses.begin(); iDetPulses != detPulses.end(); ++iDetPulses) {
00042 std::string bank = iDetPulses->first;
00043 if (!fTemplates.count(bank))
00044 fTemplates[bank] = new PulseTemplate();
00045 PulseTemplate* pTemplate = fTemplates[bank];
00046 double pDT = gSetup->GetClockTick(bank);
00047 int pPol = gSetup->GetTriggerPolarity(bank);
00048 double pPed = (double)gSetup->GetPedestal(bank);
00049 double pMax = std::pow(2.,(double)(gSetup->GetNBits(bank))) - 1.;
00050 double pThresh = (pPol > 0 ? (pMax - pPed) / 2. : pPed / 2.);
00051
00052 std::vector<TPulseIsland*>& pulses = iDetPulses->second;
00053 int iPulse = 0;
00054 while (!pTemplate->Converged() && iPulse < pulses.size()) {
00055 TPulseIsland* pulse = pulses[iPulse++];
00056 std::vector<PrePulse> prepulses = PrePulse::FindPrePulses(pulse, pThresh/2., pThresh/4.);
00057 if (prepulses.size() == 1) {
00058 if (pTemplate->GetNumberOfPulses() == 0) {
00059
00060
00061
00062 std::vector<int> samples = pulse->GetSamples();
00063 int i = prepulses.at(0).GetLocation();
00064 double s1 = (double)samples[i-1];
00065 double s2 = (double)samples[i];
00066 double s3 = (double)samples[i+1];
00067 double t = (s3 - s1) / (s1 + s2 + s3);
00068 pTemplate->AddPulse(pulse, t);
00069 pTemplate->Save(fTemplateFile);
00070 } else {
00071 double p, a, t, t0;
00072 p = pPed;
00073 a = pPol * ((double)prepulses.at(0).GetHeight() - pPed);
00074 t0 = (double)prepulses.at(0).GetLocation();
00075 t = t0;
00076 pTemplate->Chi2Fit(pulse, p, a, t);
00077 pTemplate->AddPulse(pulse, t - t0);
00078 }
00079 prepulses.at(0).Print();
00080 pTemplate->Print();
00081 }
00082 }
00083 }
00084
00085
00086 return 0;
00087 }