Maybe this works:
#include "TH1.h"
#include "TH2.h"
#include "THnSparse.h"
#include "TAxis.h"
#include "TString.h"
// Usage example: TH1D *h1 = Project1D(his3D, 449.5, 452.5, 668.5, 671.5);
// Note: in principle, you should set low1 <= up1 and low2 <= up2
TH1D *Project1D(THnSparse *h, // the ("totally unsymmetric") "cubic" histogram
Double_t low1, Double_t up1, // the first "window"
Double_t low2, Double_t up2, // the second "window"
Option_t *option = "") { // THnSparse::Projection option
if (!h) return 0; // just a precaution
TAxis *a0 = h->GetAxis(0);
TAxis *a1 = h->GetAxis(1);
TAxis *a2 = h->GetAxis(2);
a0->SetRange(a0->FindFixBin( low1 ), a0->FindFixBin( up1 ));
a1->SetRange(a1->FindFixBin( low2 ), a1->FindFixBin( up2 ));
a2->SetRange(-1, -1);
TH1D *h1 = h->Projection(2, option);
h1->SetName(TString::Format("%s_Project1D", h->GetName()));
a0->SetRange(a0->FindFixBin( low2 ), a0->FindFixBin( up2 ));
a1->SetRange(a1->FindFixBin( low1 ), a1->FindFixBin( up1 ));
TH1D *hi = h->Projection(2, option);
h1->Add(hi);
delete hi; // no longer needed
a0->SetRange(a0->FindFixBin( low1 ), a0->FindFixBin( up1 ));
a1->SetRange(-1, -1);
a2->SetRange(a2->FindFixBin( low2 ), a2->FindFixBin( up2 ));
hi = h->Projection(1, option);
h1->Add(hi);
delete hi; // no longer needed
a0->SetRange(a0->FindFixBin( low2 ), a0->FindFixBin( up2 ));
a2->SetRange(a2->FindFixBin( low1 ), a2->FindFixBin( up1 ));
hi = h->Projection(1, option);
h1->Add(hi);
delete hi; // no longer needed
a0->SetRange(-1, -1);
a1->SetRange(a1->FindFixBin( low1 ), a1->FindFixBin( up1 ));
a2->SetRange(a2->FindFixBin( low2 ), a2->FindFixBin( up2 ));
hi = h->Projection(0, option);
h1->Add(hi);
delete hi; // no longer needed
a1->SetRange(a1->FindFixBin( low2 ), a1->FindFixBin( up2 ));
a2->SetRange(a2->FindFixBin( low1 ), a2->FindFixBin( up1 ));
hi = h->Projection(0, option);
h1->Add(hi);
delete hi; // no longer needed
a0->SetRange(-1, -1);
a1->SetRange(-1, -1);
a2->SetRange(-1, -1);
return h1;
}
// Usage example: TH2D *h2 = Project2D(his3D, 449.5, 452.5);
// Note: in principle, you should set low <= up
TH2D *Project2D(THnSparse *h, // the ("totally unsymmetric") "cubic" histogram
Double_t low, Double_t up, // the "window"
Option_t *option = "") { // THnSparse::Projection option
if (!h) return 0; // just a precaution
TAxis *a0 = h->GetAxis(0);
TAxis *a1 = h->GetAxis(1);
TAxis *a2 = h->GetAxis(2);
a0->SetRange(a0->FindFixBin( low ), a0->FindFixBin( up ));
a1->SetRange(-1, -1);
a2->SetRange(-1, -1);
TH2D *h2 = h->Projection(1, 2, option);
h2->SetName(TString::Format("%s_Project2D", h->GetName()));
TH2D *hi = h->Projection(2, 1, option);
h2->Add(hi);
delete hi; // no longer needed
a0->SetRange(-1, -1);
a1->SetRange(a1->FindFixBin( low ), a1->FindFixBin( up ));
a2->SetRange(-1, -1);
hi = h->Projection(0, 2, option);
h2->Add(hi);
delete hi; // no longer needed
hi = h->Projection(2, 0, option);
h2->Add(hi);
delete hi; // no longer needed
a0->SetRange(-1, -1);
a1->SetRange(-1, -1);
a2->SetRange(a2->FindFixBin( low ), a2->FindFixBin( up ));
hi = h->Projection(0, 1, option);
h2->Add(hi);
delete hi; // no longer needed
hi = h->Projection(1, 0, option);
h2->Add(hi);
delete hi; // no longer needed
a0->SetRange(-1, -1);
a1->SetRange(-1, -1);
a2->SetRange(-1, -1);
return h2;
}