00001 const char* infileA="links/P01hf.nofield.refitOS.slice/dip5.typec.slice.root";
00002 const char* infileB="links/P01hf.nofield.2230026.noExB.refitOS.slice/dip5.typec.slice.root";
00003 const char* outfile="links/P01hf.nofield.refitOS.slice/dip5.typec.slice.ExBsubNoExB.root";
00004 void subtract(const char* inFileA=infileA,
00005 const char* inFileB=infileB,
00006 const char* outFile=outfile)
00007 {
00008 cout << "infileA=" << inFileA << endl
00009 << "infileB=" << inFileB << endl
00010 << "outFile=" << outFile << endl;
00011
00012 TFile inRootA(inFileA); if(!inRootA.IsOpen()) return;
00013 TFile inRootB(inFileB); if(!inRootB.IsOpen()) return;
00014 TFile outRoot(outFile,"RECREATE"); if(!outRoot) return;
00015
00016 TIterator* iterator = inRootA.GetListOfKeys()->MakeIterator();
00017 TKey* key;
00018 int count(0);
00019 while( (key=dynamic_cast<TKey*>(iterator->Next())) != 0){
00020
00021 TH1 *hA=0,*hB=0,*hOut=0;
00022 hA = (TH1*)inRootA.Get(key->GetName());
00023 if(hA->GetDimension()!=1) continue;
00024
00025 hB = (TH1*)inRootB.Get(key->GetName());
00026 if(!hB) {
00027 cout << "Cannot find " << key->GetName()
00028 << " in file " << inFileB << endl;
00029 continue;
00030 }
00031 if(hA->GetNbinsX()!=hB->GetNbinsX() ||
00032 hA->GetXaxis()->GetBinLowEdge(1) != hB->GetXaxis()->GetBinLowEdge(1)){
00033 cout << "Different bins " << key->GetName() << endl;
00034 continue;
00035 }
00036 if(hA->GetXaxis()->GetXbins()){
00037 hOut = new TH1D(hA->GetName(),hA->GetTitle(),
00038 hA->GetNbinsX(),hA->GetXaxis()->GetXbins()->GetArray());
00039 }
00040 else{
00041 hOut = new TH1D(hA->GetName(),hA->GetTitle(),
00042 hA->GetNbinsX(),
00043 hA->GetXaxis()->GetBinLowEdge(1),
00044 hA->GetXaxis()->GetBinUpEdge(hA->GetNbinsX()));
00045 }
00046
00047 for(int i=1; i<=hA->GetNbinsX(); i++){
00048 double val=hA->GetBinContent(i)-hB->GetBinContent(i);
00049 double err=sqrt(hA->GetBinError(i)*hA->GetBinError(i)+
00050 hB->GetBinError(i)*hB->GetBinError(i));
00051 hOut->SetBinContent(i,val);
00052 hOut->SetBinError(i,err);
00053 }
00054 hOut->Write();
00055
00056
00057 }
00058 outRoot->Close();
00059 }