Here is some sample code for 1).
Untested - sorry.
[code]#include <TH1.h>
THnSparse::THnSparse( TH1 *originalHist, Int_t chunksize ):
TNamed(name, title), fNdimensions( originalHist->GetDimension() ),
fChunkSize(chunksize), fFilledBins(0),
fAxes( originalHist->GetDimension() ), fEntries(0), fTsumw(0), fTsumw2(-1.),
fTsumwx( originalHist->GetDimension() ),
fTsumwx2( originalHist->GetDimension() ),
fCompactCoord(0), fIntegral(0), fIntegralStatus(kNoInt)
{
// Construct a THnSparse from a dense histogram
Int_t nbins[3] = { -1, -1, -1 };
TAxis *axes[] = { originalHist->GetXaxis(),
originalHist->GetYaxis(),
originalHist->GetZaxis() };
for ( Int_t i = 0; i < fNdimensions; ++i )
{
TAxis *axis = axes[i]->Clone();
fAxes.AddAtAndExpand( axis, i );
nbins[i] = axis->GetNbins();
}
fAxes.SetOwner();
fCompactCoord = new THnSparseCompactBinCoord( dim, nbins );
fBinContent.SetOwner();
Double_t value = 0;
Int_t coord[3] = { 0, 0, 0 };
UInt_t origBin = 0;
for ( coord[2] = 0; coord[2] <= nbins[2] + 1; coord[2]++ )
for ( coord[1] = 0; coord[1] <= nbins[1] + 1; coord[1]++ )
for ( coord[0] = 0; coord[0] <= nbins[0] + 1; coord[0]++ )
{
origBin = originalHist->FindBin( coord[0], coord[1], coord[2] );
value = originalHist->GetBinContent( origBin );
if ( value )
{
SetBinContent( coord, value );
#error Don’t know how to determine whether sumw2 is on
if ( sumw2 is on )
{
GetCompactCoord()->SetCoord( coord );
Long_t bin = GetBinIndexForCurrentBin(kTRUE);
THnSparseArrayChunk* chunk = GetChunk( bin / fChunkSize );
chunk->fSumw2->SetAt( originalHist->GetSumw2()[origBin], bin % fChunkSize);
}
}
}
fEntries = originalHist->GetEntries();
// Not sure what to do for these (THnSparse stores sumwx{,2} for each dim)
//~ fTsumw = originalHist->fTsumw;
//~ fTsumw2 = originalHist->fTsumw2;
//~ fTsumwx = originalHist->fTsumwx;
//~ fTsumwx2 = originalHist->fTsumwx2;
delete [] nbins;
}[/code]