00001 #include "SimpleHistograms.h"
00002 #include <iostream>
00003 #include <stdio.h>
00004 #include <stdlib.h>
00005 #include <string>
00006 #include <map>
00007 #include <utility>
00008 #include "definitions.h"
00009
00010 #include "TH2.h"
00011
00012 using std::string;
00013 using std::map;
00014 using std::vector;
00015 using std::pair;
00016
00017 static bool verbose = false;
00018 static TH2 *hNumberOfNoCoincidences = 0;
00019 static TH2 *hBankSize = 0;
00020 static vector<string> banks;
00021
00022 SimpleHistograms::SimpleHistograms(const char *HistogramDirectoryName) :
00023 BaseModule(HistogramDirectoryName){
00024
00025
00026 banks.push_back("Nec0");
00027 banks.push_back("Nfc0");
00028 banks.push_back("Ngc0");
00029 banks.push_back("Nhc0");
00030 banks.push_back("Nae0");
00031 banks.push_back("Nbe0");
00032 banks.push_back("Nce0");
00033 banks.push_back("Nee0");
00034
00035
00036
00037
00038 hBankSize = new TH2F("hBankSize", "Bank size",
00039 1500, -1.5, 1498.5, banks.size(), 0.5, banks.size()+0.5);
00040
00041 for(unsigned int i = 1; i<=banks.size(); ++i) hBankSize->GetYaxis()->SetBinLabel(i, banks.at(i-1).data());
00042
00043
00044
00045 int NrComparisons = banks.size() * (banks.size()-1) / 2;
00046
00047 hNumberOfNoCoincidences = new TH2F("hNumberOfNoCoincidences", "Number of missing coincidences per tree entry",
00048 1000, -1.5, 998.5, NrComparisons, 0.5, NrComparisons+0.5);
00049 }
00050
00051 SimpleHistograms::~SimpleHistograms(){
00052 }
00053
00054 int SimpleHistograms::ProcessEntry(TGlobalData *gData){
00055 typedef StringPulseIslandMap::iterator map_iterator;
00056
00057 vector<TPulseIsland*> islands[banks.size()];
00058 for(unsigned int b1 = 0; b1 < banks.size(); ++b1){
00059 string bank = banks.at(b1);
00060 for(map_iterator iter = gData->fPulseIslandToChannelMap.begin();
00061 iter != gData->fPulseIslandToChannelMap.end(); iter++){
00062 if(strcmp((iter->first).data(), bank.data()) == 0){
00063 islands[b1] = iter->second;
00064 }
00065 }
00066 hBankSize->Fill(islands[b1].size(), b1+1);
00067 }
00068
00069 PulseIslandList islands1, islands2;
00070
00071 int count = 1;
00072
00073 for(unsigned int b1 = 0; b1 < banks.size()-1; ++b1){
00074 for(unsigned int b2 = b1+1; b2 < banks.size(); ++b2){
00075 char title[100];
00076 sprintf(title, "%s - %s", banks.at(b1).data(), banks.at(b2).data());
00077 hNumberOfNoCoincidences->GetYaxis()->SetBinLabel(count, title);
00078
00079 int last = 0;
00080 int NumberOfNoCoincidences = 0;
00081
00082 if(verbose){
00083 for(unsigned int i = 0; i < islands[b1].size(); ++i){
00084 std::cout << "i = " << i << ": " << islands[b1][i]->GetTimeStamp() * islands[b1][i]->GetClockTickInNs() << "\n";
00085 }
00086 for(unsigned int i = 0; i < islands[b2].size(); ++i){
00087 std::cout << "i = " << i << ": " << islands[b2][i]->GetTimeStamp() * islands[b2][i]->GetClockTickInNs() << "\n";
00088 }
00089 }
00090
00091 for(unsigned int i = 0; i < islands[b1].size(); ++i){
00092 double t1 = islands[b1][i]->GetTimeStamp();
00093 bool foundCoincidence = false;
00094 for(unsigned int j = last; j < islands[b2].size(); ++j){
00095 double t2 = islands[b2][j]->GetTimeStamp();
00096 double tdiff = t2 - t1;
00097
00098 if(tdiff < -200.){
00099 last = j;
00100 continue;
00101 }
00102 if(tdiff > 200.){
00103 break;
00104 }
00105
00106 foundCoincidence = true;
00107 }
00108
00109 if(!foundCoincidence){
00110 ++NumberOfNoCoincidences;
00111 }
00112 }
00113 if(verbose)
00114 printf("Found %d tree entries with no coincidence for banks %s and %s.\n", NumberOfNoCoincidences,
00115 banks.at(b1).data(), banks.at(b2).data());
00116 hNumberOfNoCoincidences->Fill(NumberOfNoCoincidences, count++);
00117 }
00118 }
00119
00120 return 0;
00121 }