00001 #include "TemplateWriter.h"
00002
00003 #include "TemplateCalculator.h"
00004
00005 #include <iostream>
00006 #include <cmath>
00007 #include <cassert>
00008
00009 using namespace OscFit;
00010
00011 ClassImp(TemplateWriter)
00012
00013 static TemplateWriter* fgTemplateWriter = 0;
00014
00015 TemplateWriter* TemplateWriter::Instance()
00016 {
00017 if( !fgTemplateWriter ){
00018 fgTemplateWriter = new TemplateWriter();
00019 }
00020
00021 return fgTemplateWriter;
00022 }
00023
00024 TemplateWriter::TemplateWriter()
00025 {
00026 std::cout << " *** TemplateWriter::TemplateWriter() *** " << std::endl;
00027
00028 fTemplateArray = new TemplateArray();
00029
00030 fTemplateDummy = new Template();
00031 fTemplateDummy->BuildHistograms();
00032
00033 fTemplateFHC = new Template();
00034 fTemplateFHC->BuildHistograms();
00035
00036 fTemplateRHC = new Template();
00037 fTemplateRHC->BuildHistograms();
00038
00039 fTemplateALL = new Template();
00040 fTemplateALL->BuildHistograms();
00041
00042 fDirHandle = 0;
00043 fFileHandle = 0;
00044 }
00045
00046 TemplateWriter::~TemplateWriter()
00047 {
00048 delete fTemplateArray;
00049 delete fTemplateDummy;
00050
00051 delete fTemplateFHC;
00052 delete fTemplateRHC;
00053 delete fTemplateALL;
00054 }
00055
00056 void TemplateWriter::WriteSystematics( const char* filename )
00057 {
00058 std::cout << " *** TemplateWriter::WriteSystematics(...) *** " << std::endl;
00059
00060 TString name = filename;
00061 TString tag = "";
00062
00063
00064 name = filename;
00065 tag = ".noosc";
00066
00067 if( name.EndsWith(".root") )
00068 name.Insert(name.Length()-5,tag);
00069 else name.Append(tag);
00070
00071 this->WriteToFile( name );
00072
00073
00074 name = filename;
00075 tag = ".noosc.sys.norm.m1";
00076
00077 if( name.EndsWith(".root") )
00078 name.Insert(name.Length()-5,tag);
00079 else name.Append(tag);
00080
00081 this->WriteToFile( 0.0, 0.0, 0.0, 0.0,
00082 -1.0, 0.0, 0.0, 0.0, name);
00083
00084 name = filename;
00085 tag = ".noosc.sys.norm.p1";
00086
00087 if( name.EndsWith(".root") )
00088 name.Insert(name.Length()-5,tag);
00089 else name.Append(tag);
00090
00091 this->WriteToFile( 0.0, 0.0, 0.0, 0.0,
00092 +1.0, 0.0, 0.0, 0.0, name);
00093
00094
00095 name = filename;
00096 tag = ".noosc.sys.ncbkg.m1";
00097
00098 if( name.EndsWith(".root") )
00099 name.Insert(name.Length()-5,tag);
00100 else name.Append(tag);
00101
00102 this->WriteToFile( 0.0, 0.0, 0.0, 0.0,
00103 0.0,-1.0, 0.0, 0.0, name);
00104
00105 name = filename;
00106 tag = ".noosc.sys.ncbkg.p1";
00107
00108 if( name.EndsWith(".root") )
00109 name.Insert(name.Length()-5,tag);
00110 else name.Append(tag);
00111
00112 this->WriteToFile( 0.0, 0.0, 0.0, 0.0,
00113 0.0,+1.0, 0.0, 0.0, name);
00114
00115
00116 name = filename;
00117 tag = ".noosc.sys.shwen.m1";
00118
00119 if( name.EndsWith(".root") )
00120 name.Insert(name.Length()-5,tag);
00121 else name.Append(tag);
00122
00123 this->WriteToFile( 0.0, 0.0, 0.0, 0.0,
00124 0.0, 0.0,-1.0, 0.0, name);
00125
00126 name = filename;
00127 tag = ".noosc.sys.shwen.p1";
00128
00129 if( name.EndsWith(".root") )
00130 name.Insert(name.Length()-5,tag);
00131 else name.Append(tag);
00132
00133 this->WriteToFile( 0.0, 0.0, 0.0, 0.0,
00134 0.0, 0.0,+1.0, 0.0, name);
00135
00136
00137 name = filename;
00138 tag = ".noosc.sys.trken.m1";
00139
00140 if( name.EndsWith(".root") )
00141 name.Insert(name.Length()-5,tag);
00142 else name.Append(tag);
00143
00144 this->WriteToFile( 0.0, 0.0, 0.0, 0.0,
00145 0.0, 0.0, 0.0,-1.0, name);
00146
00147 name = filename;
00148 tag = ".noosc.sys.trken.p1";
00149
00150 if( name.EndsWith(".root") )
00151 name.Insert(name.Length()-5,tag);
00152 else name.Append(tag);
00153
00154 this->WriteToFile( 0.0, 0.0, 0.0, 0.0,
00155 0.0, 0.0, 0.0,+1.0, name);
00156
00157
00158
00159 if( OscFit::GetNumSystematics()>3 ){
00160 std::cout << " <warning> not accounting for all systematics - abort! " << std::endl;
00161 assert(0);
00162 }
00163
00164 return;
00165 }
00166
00167 void TemplateWriter::WriteExpectation( const char* filename )
00168 {
00169 return this->WriteToFile( filename );
00170 }
00171
00172 void TemplateWriter::WriteExpectation( Double_t dmsq, Double_t sinsq, const char* filename )
00173 {
00174 return this->WriteToFile( dmsq, sinsq, dmsq, sinsq, filename );
00175 }
00176
00177 void TemplateWriter::WriteExpectation( Double_t dmsq, Double_t sinsq, Double_t dmsqbar, Double_t sinsqbar, const char* filename )
00178 {
00179 return this->WriteToFile( dmsq, sinsq, dmsqbar, sinsqbar, filename );
00180 }
00181
00182 void TemplateWriter::WriteExpectation( Double_t dmsq, Double_t sinsq, Double_t dmsqbar, Double_t sinsqbar, Double_t norm, Double_t ncbkg, Double_t shwen, Double_t trken, const char* filename )
00183 {
00184 return this->WriteToFile( dmsq, sinsq, dmsqbar, sinsqbar,
00185 norm, ncbkg, shwen, trken,
00186 filename );
00187 }
00188
00189 void TemplateWriter::WriteToFile( const char* filename )
00190 {
00191 return this->WriteToFile( 0.0, 0.0, filename );
00192 }
00193
00194 void TemplateWriter::WriteToFile( Double_t dmsq, Double_t sinsq, const char* filename )
00195 {
00196 return this->WriteToFile( dmsq, sinsq, dmsq, sinsq, filename );
00197 }
00198
00199 void TemplateWriter::WriteToFile( Double_t dmsq, Double_t sinsq, Double_t dmsqbar, Double_t sinsqbar, const char* filename )
00200 {
00201 return this->WriteToFile( dmsq, sinsq, dmsqbar, sinsqbar,
00202 0.0, 0.0, 0.0, 0.0, filename );
00203 }
00204
00205 void TemplateWriter::WriteToFile( Double_t dmsq, Double_t sinsq, Double_t dmsqbar, Double_t sinsqbar, Double_t norm, Double_t ncbkg, Double_t shwen, Double_t trken, const char* filename )
00206 {
00207 std::cout << " *** TemplateWriter::WriteToFile(...) *** " << std::endl;
00208
00209 std::cout << " dmsq=" << dmsq << " sinsq=" << sinsq << std::endl
00210 << " dmsqbar=" << dmsqbar << " sinsqbar=" << sinsqbar << std::endl
00211 << " norm=" << norm << " ncbkg=" << ncbkg << std::endl
00212 << " shwen=" << shwen << " trken=" << trken << std::endl;
00213
00214 this->OpenFile( filename );
00215
00216
00217
00218
00219
00220
00221
00222 TemplateCalculator::Instance()->GetExpectation( dmsq, sinsq,
00223 dmsqbar, sinsqbar,
00224 1,1,1,1,
00225 1,1,1,
00226 norm, ncbkg,
00227 shwen, trken,
00228 fTemplateArray );
00229 this->AddToFile( OscFit::kData, OscFit::kNull, fTemplateArray );
00230
00231
00232 TemplateCalculator::Instance()->GetExpectation( dmsq, sinsq,
00233 dmsqbar, sinsqbar,
00234 1,1,0,0,
00235 1,1,1,
00236 norm, ncbkg,
00237 shwen, trken,
00238 fTemplateArray );
00239 this->AddToFile( OscFit::kCV, OscFit::kNull, fTemplateArray );
00240
00241
00242 TemplateCalculator::Instance()->GetExpectation( dmsq, sinsq,
00243 dmsqbar, sinsqbar,
00244 1,1,0,0,
00245 1,0,0,
00246 norm, ncbkg,
00247 shwen, trken,
00248 fTemplateArray );
00249 this->AddToFile( OscFit::kCV, OscFit::kCCnu, fTemplateArray );
00250
00251
00252 TemplateCalculator::Instance()->GetExpectation( dmsq, sinsq,
00253 dmsqbar, sinsqbar,
00254 1,1,0,0,
00255 0,1,0,
00256 norm, ncbkg,
00257 shwen, trken,
00258 fTemplateArray );
00259 this->AddToFile( OscFit::kCV, OscFit::kCCnubar, fTemplateArray );
00260
00261
00262 TemplateCalculator::Instance()->GetExpectation( dmsq, sinsq,
00263 dmsqbar, sinsqbar,
00264 1,0,0,0,
00265 0,0,1,
00266 norm, ncbkg,
00267 shwen, trken,
00268 fTemplateArray );
00269 this->AddToFile( OscFit::kCV, OscFit::kNC, fTemplateArray );
00270
00271
00272 TemplateCalculator::Instance()->GetExpectation( dmsq, sinsq,
00273 dmsqbar, sinsqbar,
00274 0,1,0,0,
00275 1,1,0,
00276 norm, ncbkg,
00277 shwen, trken,
00278 fTemplateArray );
00279 this->AddToFile( OscFit::kCVTau, OscFit::kNull, fTemplateArray );
00280
00281
00282 TemplateCalculator::Instance()->GetExpectation( dmsq, sinsq,
00283 dmsqbar, sinsqbar,
00284 0,0,1,1,
00285 1,1,1,
00286 norm, ncbkg,
00287 shwen, trken,
00288 fTemplateArray );
00289 this->AddToFile( OscFit::kRock, OscFit::kNull, fTemplateArray );
00290
00291
00292 TemplateCalculator::Instance()->GetExpectation( dmsq, sinsq,
00293 dmsqbar, sinsqbar,
00294 0,0,1,1,
00295 1,0,0,
00296 norm, ncbkg,
00297 shwen, trken,
00298 fTemplateArray );
00299 this->AddToFile( OscFit::kRock, OscFit::kCCnu, fTemplateArray );
00300
00301
00302 TemplateCalculator::Instance()->GetExpectation( dmsq, sinsq,
00303 dmsqbar, sinsqbar,
00304 0,0,1,1,
00305 0,1,0,
00306 norm, ncbkg,
00307 shwen, trken,
00308 fTemplateArray );
00309 this->AddToFile( OscFit::kRock, OscFit::kCCnubar, fTemplateArray );
00310
00311
00312 TemplateCalculator::Instance()->GetExpectation( dmsq, sinsq,
00313 dmsqbar, sinsqbar,
00314 0,0,1,0,
00315 0,0,1,
00316 norm, ncbkg,
00317 shwen, trken,
00318 fTemplateArray );
00319 this->AddToFile( OscFit::kRock, OscFit::kNC, fTemplateArray );
00320
00321
00322 TemplateCalculator::Instance()->GetExpectation( dmsq, sinsq,
00323 dmsqbar, sinsqbar,
00324 0,0,0,1,
00325 1,1,0,
00326 norm, ncbkg,
00327 shwen, trken,
00328 fTemplateArray );
00329 this->AddToFile( OscFit::kRockTau, OscFit::kNull, fTemplateArray );
00330
00331
00332 this->CloseFile();
00333 }
00334
00335 void TemplateWriter::WriteData( const char* filename )
00336 {
00337 TemplateCalculator::Instance()->GetData( fTemplateArray );
00338
00339 return this->WriteToFile( fTemplateArray, filename );
00340 }
00341
00342 void TemplateWriter::WriteToFile( TemplateArray* tempArray, const char* filename )
00343 {
00344 if( tempArray==0 ) return;
00345
00346 std::cout << " *** TemplateWriter::WriteToFile(...) *** " << std::endl;
00347
00348 this->OpenFile( filename );
00349
00350 this->AddToFile( OscFit::kData, OscFit::kNull, tempArray );
00351
00352 this->CloseFile();
00353 }
00354
00355 void TemplateWriter::OpenFile( const char* filename )
00356 {
00357 std::cout << " Opening File: " << filename << std::endl;
00358
00359 if( fFileHandle ) return;
00360
00361 fDirHandle = gDirectory;
00362 fFileHandle = new TFile(filename,"recreate");
00363
00364 return;
00365 }
00366
00367 void TemplateWriter::CloseFile()
00368 {
00369 if( fFileHandle==0 ) return;
00370
00371 std::cout << " Closing File: " << fFileHandle->GetName() << std::endl;
00372
00373 fFileHandle->Close();
00374 fFileHandle = 0;
00375 gDirectory = fDirHandle;
00376 }
00377
00378 void TemplateWriter::AddToFile( Sample_t sample, Interaction_t interaction, TemplateArray* tempArray )
00379 {
00380 if( tempArray==0 ) return;
00381
00382 std::cout << " Writing Templates: [" << AsString(sample) << "]";
00383 if( interaction != OscFit::kNull) std::cout << "[" << AsString(interaction) << "]";
00384 std::cout << std::endl;
00385
00386
00387 TString baseName = "h";
00388 TString tempName = "";
00389 if( sample != OscFit::kData ){
00390 baseName.Append("_"); baseName.Append( OscFit::AsString(sample) );
00391 }
00392 if( interaction != OscFit::kNull ){
00393 baseName.Append("_"); baseName.Append( OscFit::AsString(interaction) );
00394 }
00395
00396
00397 fTemplateFHC->Reset();
00398 fTemplateRHC->Reset();
00399 fTemplateALL->Reset();
00400
00401
00402 for( Int_t irun=0; irun<OscFit::GetNumRuns(); irun++ ){
00403 Run_t run = OscFit::GetRun(irun);
00404 Template* temp = tempArray->GetTemplate(run);
00405 if( temp==0 ) temp = fTemplateDummy;
00406
00407 tempName = baseName; tempName.Append("_");
00408 tempName.Append( OscFit::AsString(run) );
00409
00410 this->AddToFile( temp, tempName.Data() );
00411
00412 if( OscFit::GetRunType(run)==OscFit::kFHC ) fTemplateFHC->Add( temp );
00413 if( OscFit::GetRunType(run)==OscFit::kRHC ) fTemplateRHC->Add( temp );
00414 fTemplateALL->Add( temp );
00415 }
00416
00417
00418 tempName = baseName; tempName.Append("_");
00419 tempName.Append( OscFit::AsString(OscFit::kFHC) );
00420 this->AddToFile( fTemplateFHC, tempName.Data() );
00421
00422 tempName = baseName; tempName.Append("_");
00423 tempName.Append( OscFit::AsString(OscFit::kRHC) );
00424 this->AddToFile( fTemplateRHC, tempName.Data() );
00425
00426 tempName = baseName; tempName.Append("_all");
00427 this->AddToFile( fTemplateALL, tempName.Data() );
00428
00429 return;
00430 }
00431
00432 void TemplateWriter::AddToFile( Template* temp, const char* baseName )
00433 {
00434 if( temp==0 ) return;
00435
00436
00437 TString histNameFiducial = baseName;
00438 histNameFiducial.Append("_fiducial");
00439 TH1D* hFiducial = 0;
00440
00441 TString histNameCorrectSign = baseName;
00442 histNameCorrectSign.Append("_correctsign");
00443 TH1D* hCorrectSign = 0;
00444
00445
00446 for( Int_t ibin=0; ibin<OscFit::GetNumBins(); ibin++ ){
00447 Bin_t bintype = OscFit::GetBin(ibin);
00448
00449
00450 TString histName = baseName; histName.Append("_");
00451 histName.Append( OscFit::AsString(bintype) );
00452
00453 Histogram* hist = temp->GetHistogramByType(bintype);
00454 TH1D* h = hist->MakeTH1D( histName.Data() );
00455
00456
00457 if( ibin>=OscFit::GetFirstFiducialBin()
00458 && ibin<=OscFit::GetLastFiducialBin() ){
00459 if( hFiducial==0 ){
00460 hFiducial = (TH1D*)(h->Clone(histNameFiducial.Data()));
00461 }
00462 else{
00463 hFiducial->Add( h );
00464 }
00465 }
00466
00467
00468 if( ibin>=OscFit::GetFirstCorrectSignBin()
00469 && ibin<=OscFit::GetLastCorrectSignBin() ){
00470 if( hCorrectSign==0 ){
00471 hCorrectSign = (TH1D*)(h->Clone(histNameCorrectSign.Data()));
00472 }
00473 else{
00474 hCorrectSign->Add( h );
00475 }
00476 }
00477
00478
00479 h->Write();
00480 }
00481
00482
00483 hFiducial->Write();
00484 hCorrectSign->Write();
00485
00486 return;
00487 }
00488
00489
00490
00491
00492