00001 #include "PlotTME_activeSiRmuStops.h"
00002 #include "RegisterModule.inc"
00003 #include "TGlobalData.h"
00004 #include "TSetupData.h"
00005 #include "ModulesOptions.h"
00006 #include "definitions.h"
00007 #include "TMuonEvent.h"
00008 #include "debug_tools.h"
00009 #include "EventNavigator.h"
00010 #include "ActiveSiRMuStopAlgo.h"
00011
00012 #include <TH1F.h>
00013 #include <TH2F.h>
00014 #include <TLine.h>
00015
00016 #include <iostream>
00017 using std::cout;
00018 using std::endl;
00019
00020 extern MuonEventList gMuonEvents;
00021
00022 PlotTME_activeSiRmuStops::PlotTME_activeSiRmuStops(modules::options* opts):
00023 BaseModule("PlotTME_activeSiRmuStops",opts),
00024 fStoppedMus(0),fStoppedMus_PP(0), fNStopsThisEvent(0),fNStopsThisEvent_PP(0), fEventNo(1),
00025 fMuSc(opts->GetString("second","muSc")),
00026 fSiR2(opts->GetString("first","SiR2")),
00027 fChannel((TDetectorPulse::ParentChannel_t) (IDs::channel::GetSlowFastEnum(opts->GetString("channel","fast"))-IDs::kFast)),
00028 fMuScMax(opts->GetDouble("muSc_max",1e9)),
00029 fMuScMin(opts->GetDouble("muSc_min",0)),
00030 fSiR2Max(opts->GetDouble("SiR2_max",1e9)),
00031 fSiR2Min(opts->GetDouble("SiR2_min",0)),
00032 fHasStoppedMuon(new TMEAlgorithm::ActiveSiRStop(IDs::source(),fMuScMin,fMuScMax,fSiR2Min,fSiR2Max))
00033 {
00034 DEBUG_VALUE(fMuSc, fSiR2,fChannel);
00035 }
00036
00037 PlotTME_activeSiRmuStops::~PlotTME_activeSiRmuStops(){
00038 if(fHasStoppedMuon) delete fHasStoppedMuon;
00039 }
00040
00041 int PlotTME_activeSiRmuStops::BeforeFirstEntry(TGlobalData* gData,const TSetupData *setup){
00042
00043 fTDiff=new TH1F("hTDiff", "TDiff of SiR2 hits compared to muSc (with pile-up)", 5000, -1.2e4,1.2e4);
00044 fTDiff->SetXTitle("t_{SiR2} - t_{muSc} (ns)");
00045 fTDiff_PP=new TH1F("hTDiff_PP", "TDiff of SiR2 hits compared to muSc (pile-up protected)", 5000, -1.2e4,1.2e4);
00046 fTDiff_PP->SetXTitle(fTDiff->GetXaxis()->GetTitle());
00047
00048 fTDiffMuons=new TH1F("hTDiffMuons", "TDiff of muons considered to have stopped (with pile-up)", 5000, -1.2e4,1.2e4);
00049 fTDiffMuons->SetXTitle("t_{SiR2} - t_{muSc} (ns)");
00050 fTDiffMuons_PP=new TH1F("hTDiffMuons_PP", "TDiff of muons considered to have stopped (pile-up protected)", 5000, -1.2e4,1.2e4);
00051 fTDiffMuons_PP->SetXTitle(fTDiffMuons->GetXaxis()->GetTitle());
00052
00053 fTDiffVsAmpSiR2=new TH2F("hTDiffVsAmpSiR2",
00054 "Amplitudes of SiR2 hits (with pile-up) against the time difference compared to muSc ",
00055 400, -1.1e4, 1.1e4, 400,0,4000);
00056 fTDiffVsAmpSiR2->SetXTitle(fTDiff->GetXaxis()->GetTitle());
00057 fTDiffVsAmpSiR2->SetYTitle("Amplitude in SiR2 (ADC units)");
00058 fTDiffVsAmpSiR2_PP=new TH2F("hTDiffVsAmpSiR2_PP",
00059 "Amplitudes of SiR2 hits (pile-up protected) against the time diference compared to muSc",
00060 400, -1.1e4, 1.1e4, 400,0,4000);
00061 fTDiffVsAmpSiR2_PP->SetXTitle(fTDiffVsAmpSiR2->GetXaxis()->GetTitle());
00062 fTDiffVsAmpSiR2_PP->SetYTitle(fTDiffVsAmpSiR2->GetYaxis()->GetTitle());
00063
00064
00065
00066
00067
00068
00069 fTDiffVsAmpSiR2_MuStop_PP=new TH2F("hTDiffVsAmpSiR2_MuStop_PP",
00070 "Amplitudes of SiR2 hits compared to muSc (pile-up protected) against the time diference",
00071 400, -1.1e4, 1.1e4, 400,0,4000);
00072 fTDiffVsAmpSiR2_MuStop_PP->SetXTitle(fTDiffVsAmpSiR2->GetXaxis()->GetTitle());
00073 fTDiffVsAmpSiR2_MuStop_PP->SetYTitle(fTDiffVsAmpSiR2->GetYaxis()->GetTitle());
00074
00075
00076 fAmplitudes=new TH2F("hAmp2d", "Amplitudes of SiR2 hits compared to muSc (with pile-up)", 400, 0,4000, 400,0,4000);
00077 fAmplitudes->SetXTitle("Amplitude in muSc (ADC units)");
00078 fAmplitudes->SetYTitle("Amplitude in SiR2 (ADC units)");
00079 fAmplitudes_PP=new TH2F("hAmp2d_PP", "Amplitudes of SiR2 hits compared to muSc (pile-up protected)", 400, 0,4000, 400,0,4000);
00080 fAmplitudes_PP->SetXTitle(fAmplitudes->GetXaxis()->GetTitle());
00081 fAmplitudes_PP->SetYTitle(fAmplitudes->GetYaxis()->GetTitle());
00082
00083 const EventNavigator& event_ngtr= EventNavigator::Instance();
00084 fStopsPerEvent=new TH1F("hStoppedPerEvent","Number of #mu stops per midas event (with pile-up)",
00085 event_ngtr.GetLoopNEntries(), event_ngtr.GetStartEntry(), event_ngtr.GetStopEntry());
00086 fStopsPerEvent->SetXTitle("Event Number");
00087 fStopsPerEvent->SetYTitle("Number of #mu stops");
00088
00089 fStopsPerEvent_PP=new TH1F("hStoppedPerEvent_PP","Number of #mu stops per midas event (pile-up protected)",
00090 event_ngtr.GetLoopNEntries(), event_ngtr.GetStartEntry(), event_ngtr.GetStopEntry());
00091 fStopsPerEvent_PP->SetXTitle("Event Number");
00092 fStopsPerEvent_PP->SetYTitle("Number of #mu stops");
00093
00094 fStops=new TH1F("hStopped","Number of #mu stops per midas event (pile-up protected)", 250, 0, 250);
00095 fStops->SetXTitle("Number of #mu stops");
00096 fStops_PP=new TH1F("hStopped_PP","Number of #mu stops per midas event (pile-up protected)", 250, 0, 250);
00097 fStops_PP->SetXTitle("Number of #mu stops");
00098
00099
00100 return 0;
00101 }
00102
00103 int PlotTME_activeSiRmuStops::ProcessEntry(TGlobalData* gData,const TSetupData *setup){
00104
00105 fNStopsThisEvent=0;
00106 fNStopsThisEvent_PP=0;
00107
00108
00109 for(MuonEventList::const_iterator i_tme=gMuonEvents.begin();
00110 i_tme!=gMuonEvents.end(); ++i_tme){
00111
00112 for(int muSc_source_index = (*i_tme)->GetFirstSourceIndex(fMuSc);
00113 muSc_source_index < (*i_tme)->GetLastSourceIndex(fMuSc)
00114 && muSc_source_index > -1; ++muSc_source_index){
00115 const IDs::source& muSc_source=(*i_tme)->GetSource(muSc_source_index);
00116
00117 for(int siR2_source_index = (*i_tme)->GetFirstSourceIndex(fSiR2);
00118 siR2_source_index < (*i_tme)->GetLastSourceIndex(fSiR2)
00119 && siR2_source_index > -1; ++siR2_source_index){
00120 const IDs::source& siR2_source=(*i_tme)->GetSource(siR2_source_index);
00121
00122 FillHistograms(*i_tme, muSc_source, siR2_source);
00123 }
00124 }
00125 }
00126
00127 fStopsPerEvent->Fill(fEventNo, fNStopsThisEvent);
00128 fStopsPerEvent_PP->Fill(fEventNo, fNStopsThisEvent_PP);
00129 fStops->Fill( fNStopsThisEvent);
00130 fStops_PP->Fill( fNStopsThisEvent_PP);
00131 ++fEventNo;
00132 fStoppedMus+=fNStopsThisEvent;
00133 fStoppedMus_PP+=fNStopsThisEvent_PP;
00134 return 0;
00135 }
00136
00137 void PlotTME_activeSiRmuStops::FillHistograms(const TMuonEvent* tme, const IDs::source& muSc_source, const IDs::source& sir2_source){
00138
00139 const double muSc_amp=tme->GetCentralMuon()->GetAmplitude(TDetectorPulse::kFast);
00140
00141 const double time=tme->GetTime();
00142 const int N_muSc=tme->NumPulses(muSc_source);
00143 const int N_sir2=tme->NumPulses(sir2_source);
00144
00145
00146 fHasStoppedMuon->SetSiR2Source(sir2_source);
00147 bool a_stop=(*fHasStoppedMuon)(tme,fChannel);
00148 if(a_stop) {
00149 ++fNStopsThisEvent;
00150 if(!tme->HasMuonPileup()) ++fNStopsThisEvent_PP;
00151 }
00152
00153
00154 for(int i=0; i< N_sir2; ++i){
00155 const TDetectorPulse* sir2_tdp=tme->GetPulse(sir2_source,i);
00156 const double t_diff=sir2_tdp->GetTime(fChannel) - time;
00157 const double sir2_amp=sir2_tdp->GetAmplitude(fChannel);
00158 fTDiff->Fill(t_diff);
00159 fTDiffVsAmpSiR2->Fill(t_diff, sir2_amp );
00160 if(!tme->HasMuonPileup()){
00161 if(muSc_amp>fMuScMin && muSc_amp< fMuScMax){
00162 fTDiff_PP->Fill(t_diff);
00163 fTDiffVsAmpSiR2_PP->Fill(t_diff, sir2_amp );
00164 if(a_stop){
00165 fTDiffMuons_PP->Fill(t_diff);
00166 fTDiffVsAmpSiR2_MuStop_PP->Fill(t_diff,sir2_amp);
00167 }
00168 }
00169 }
00170 for(int j=0; j< N_muSc; ++j){
00171 const double muSc_amp=tme->GetPulse(muSc_source,j)->GetAmplitude(TDetectorPulse::kFast);
00172 fAmplitudes->Fill(muSc_amp, sir2_amp );
00173 if(!tme->HasMuonPileup()){
00174 fAmplitudes_PP->Fill(muSc_amp, sir2_amp );
00175 }
00176 }
00177 }
00178 }
00179
00180 int PlotTME_activeSiRmuStops::AfterLastEntry(TGlobalData* gData,const TSetupData *setup){
00181 double y_min=fAmplitudes->GetYaxis()->GetXmin();
00182 double y_max=fAmplitudes->GetYaxis()->GetXmax();
00183 TLine* muSc_cut=new TLine(fMuScMin, y_min, fMuScMin, y_max);
00184 muSc_cut->SetLineColor(kRed);
00185 fAmplitudes->GetListOfFunctions()->Add(muSc_cut->Clone());
00186 fAmplitudes_PP->GetListOfFunctions()->Add(muSc_cut->Clone());
00187 muSc_cut->SetX1(fMuScMax);
00188 muSc_cut->SetX2(fMuScMax);
00189 fAmplitudes->GetListOfFunctions()->Add(muSc_cut->Clone());
00190 fAmplitudes_PP->GetListOfFunctions()->Add(muSc_cut->Clone());
00191 fTDiffVsAmpSiR2_MuStop_PP->ProjectionY("_py",236);
00192
00193 cout<<"PlotTME_activeSiRmuStops::AfterLastEntry: Total number of muon stops = "<<fStoppedMus<<endl;
00194 return 0;
00195 }
00196
00197 ALCAP_REGISTER_MODULE(PlotTME_activeSiRmuStops, muSc_min,muSc_max, SiR2_min, SiR2_max, first, channel);