00001 #include "Alignment/AlignHists.h"
00002
00003 #include "TH2.h"
00004 #include "TFile.h"
00005 #include "TSystem.h"
00006
00007 #include <vector>
00008 #include <iostream>
00009 using std::cerr;
00010 using std::endl;
00011
00012
00013 AlignHists::AlignHists(int nplanes, int nmdlperplane, const char* histname)
00014 : fIteration(0)
00015 ,fHistName(histname)
00016 {
00017 cerr << "AlignHists::AlignHists("
00018 << nplanes << "," << nmdlperplane << ")\n";
00019
00020 fNumberOfTracks[0] = new TH2D("NumberOfTracksU",
00021 "Number of tracks per scint module, U view",
00022 nplanes,0,nplanes,
00023 nmdlperplane,0,nmdlperplane);
00024 fNumberOfTracks[1] = new TH2D("NumberOfTracksV",
00025 "Number of tracks per scint module, V view",
00026 nplanes,0,nplanes,
00027 nmdlperplane,0,nmdlperplane);
00028 fNumberOfTracksStrips[0] = new TH2D("NumberOfTracksStripsU",
00029 "Number of tracks per strip, U view",
00030 nplanes,0,nplanes,
00031 192,0,192);
00032 fNumberOfTracksStrips[1] = new TH2D("NumberOfTracksStripsV",
00033 "Number of tracks per strip, V view",
00034 nplanes,0,nplanes,
00035 192,0,192);
00036
00037 for (int view = 0; view < 2; ++view) {
00038 char view_char = 'U';
00039 if (view) view_char = 'V';
00040
00041 for (int itt = 0; itt < 20; ++ itt) {
00042 char name[80];
00043 char title[80];
00044 sprintf(name,"ResidHist%c%02d",view_char,itt);
00045 sprintf(title,"Per Module Residuals %c view, iter %02d",
00046 view_char,itt);
00047
00048 fResidHist[view][itt] = new TH2D(name, title,
00049 nplanes,0,nplanes,
00050 nmdlperplane,0,nmdlperplane);
00051 fResidHist[view][itt]->Sumw2();
00052 sprintf(name,"ResidSqrHist%c%02d",view_char,itt);
00053 sprintf(title,"Per Module Residuals**2 %c view, iter %02d",
00054 view_char,itt);
00055
00056 fResidSqrHist[view][itt] = new TH2D(name, title,
00057 nplanes,0,nplanes,
00058 nmdlperplane,0,nmdlperplane);
00059 }
00060 }
00061
00062 cerr << "AlignHists::AlignHists() done\n";
00063 }
00064
00065 AlignHists::AlignHists(const char* filename)
00066 : fIteration(0)
00067 ,fHistName(filename)
00068 {
00069 cerr << "AlignHists::AlignHists("<<filename<<")\n";
00070
00071 fNumberOfTracks[0] = new TH2D("NumberOfTracksU",
00072 "Number of tracks per scint module, U view",
00073 500,0,500,8,0,8);
00074 fNumberOfTracks[1] = new TH2D("NumberOfTracksV",
00075 "Number of tracks per scint module, V view",
00076 500,0,500, 8,0,8);
00077 fNumberOfTracksStrips[0] = new TH2D("NumberOfTracksStripsU",
00078 "Number of tracks per strip, U view",
00079 500,0,500, 192,0,192);
00080 fNumberOfTracksStrips[1] = new TH2D("NumberOfTracksStripsV",
00081 "Number of tracks per strip, V view",
00082 500,0,500, 192,0,192);
00083
00084 for (int view = 0; view < 2; ++view) {
00085 char view_char = 'U';
00086 if (view) view_char = 'V';
00087
00088 for (int itt = 0; itt < 20; ++ itt) {
00089 char name[80];
00090 char title[80];
00091 sprintf(name,"ResidHist%c%02d",view_char,itt);
00092 sprintf(title,"Per Module Residuals %c view, iter %02d",
00093 view_char,itt);
00094
00095 fResidHist[view][itt] = new TH2D(name, title,500,0,500,8,0,8);
00096 fResidHist[view][itt]->Sumw2();
00097 sprintf(name,"ResidSqrHist%c%02d",view_char,itt);
00098 sprintf(title,"Per Module Residuals**2 %c view, iter %02d",
00099 view_char,itt);
00100
00101 fResidSqrHist[view][itt] = new TH2D(name, title,500,0,500,8,0,8);
00102 }
00103 }
00104
00105
00106 }
00107
00108 void AlignHists::LoadFromFile(const char* histname)
00109 {
00110 TFile* leak = new TFile(histname);
00111 fNumberOfTracks[0] = (TH2D*)leak->Get("NumberOfTracksU");
00112 fNumberOfTracks[1] = (TH2D*)leak->Get("NumberOfTracksV");
00113
00114 for (int view = 0; view < 2; ++view) {
00115 char view_char = 'U';
00116 if (view) view_char = 'V';
00117
00118 for (int itt = 0; itt < 20; ++ itt) {
00119 char name[80];
00120
00121 sprintf(name,"ResidHist%c%02d",view_char,itt);
00122 fResidHist[view][itt] = (TH2D*)leak->Get(name);
00123
00124 sprintf(name,"ResidSqrHist%c%02d",view_char,itt);
00125 fResidSqrHist[view][itt] = (TH2D*)leak->Get(name);
00126 }
00127 }
00128 fNumberOfTracksStrips[0] = (TH2D*)leak->Get("NumberOfTracksStripsU");
00129 fNumberOfTracksStrips[1] = (TH2D*)leak->Get("NumberOfTracksStripsV");
00130 }
00131
00132 static void add2d(TH2D* h1, TH2D* h2)
00133 {
00134 int nx = h2->GetNbinsX(), ny = h2->GetNbinsY();
00135 for (int x=1; x<=nx; ++x) {
00136 for (int y=1; y<=ny; ++y) {
00137 h1->SetBinContent(x,y,
00138 h1->GetBinContent(x,y) +
00139 h2->GetBinContent(x,y));
00140 h1->SetEntries(h1->GetEntries()+h2->GetEntries());
00141 }
00142 }
00143 }
00144
00145 void AlignHists::ReadHists(const char* filename)
00146 {
00147 TFile file(filename);
00148
00149 add2d(fNumberOfTracks[0],(TH2D*)file.Get("NumberOfTracksU"));
00150 add2d(fNumberOfTracks[1],(TH2D*)file.Get("NumberOfTracksV"));
00151
00152 add2d(fNumberOfTracksStrips[0],(TH2D*)file.Get("NumberOfTracksStripsU"));
00153 add2d(fNumberOfTracksStrips[1],(TH2D*)file.Get("NumberOfTracksStripsV"));
00154
00155 for (int view = 0; view < 2; ++view) {
00156 char view_char = 'U';
00157 if (view) view_char = 'V';
00158
00159 for (int itt = 0; itt < 20; ++ itt) {
00160 char name[80];
00161
00162 sprintf(name,"ResidHist%c%02d",view_char,itt);
00163 add2d(fResidHist[view][itt],(TH2D*)file.Get(name));
00164
00165 sprintf(name,"ResidSqrHist%c%02d",view_char,itt);
00166 add2d(fResidSqrHist[view][itt],(TH2D*)file.Get(name));
00167 }
00168 }
00169
00170 }
00171
00172
00173 AlignHists::~AlignHists()
00174 {
00175
00176 if (!fHistName) fHistName = "alignment-hists.root";
00177 TFile userFile(fHistName,"RECREATE");
00178 for (int view = 0; view < 2; ++view) {
00179 for (int itt = 0; itt < 20; ++ itt) {
00180
00181
00182
00183 fResidHist[view][itt]->Write();
00184 fResidSqrHist[view][itt]->Write();
00185 }
00186 fNumberOfTracks[view]->Write();
00187 fNumberOfTracksStrips[view]->Write();
00188 }
00189 }
00190
00191 void AlignHists::ApplyTrack(PlaneView::PlaneView_t the_view,
00192 std::vector<int>& strip,
00193 std::vector<int>& plane, std::vector<int>& mdl,
00194 std::vector<double>& resid)
00195 {
00196 static int count=0;
00197 ++count;
00198
00199
00200 int view=0;
00201 if (the_view == PlaneView::kV) view = 1;
00202 cerr << "AlignHists::ApplyTrack " << resid.size() << " points,"
00203 << " iteration=" << fIteration << endl;
00204 for (unsigned int ind = 0; ind < resid.size(); ++ind) {
00205 cerr << ".";
00206 TH2D* hist;
00207
00208 hist = fResidHist[view][fIteration];
00209 hist->Fill(plane[ind],mdl[ind],resid[ind]);
00210
00211 hist = fResidSqrHist[view][fIteration];
00212 hist->Fill(plane[ind],mdl[ind],resid[ind]*resid[ind]);
00213
00214 if (!fIteration) {
00215 fNumberOfTracks[view]->Fill(plane[ind],mdl[ind],1.0);
00216 fNumberOfTracksStrips[view]->Fill(plane[ind],strip[ind],1.0);
00217 }
00218 }
00219 cerr << endl;
00220 }
00221
00222
00223 ClassImp(AlignHists)