int main(int argc,char** argv) {
	// Anzahl an Schritten
	unsigned long numSteps = DEFAULT_STEP_COUNT;

	// Überprüfen, ob die Anzahl an Schritten als Argument übergeben wurde, wenn ja, Variable updaten
	if (argc!=2) 
		printf("Keine Schrittanzahl übergeben, verwende Standardwert von 1.000.000 ...\n");
	else {
		numSteps = strtoul(argv[1],NULL,0);
		printf("Anzahl an Integrationsschritten: %lu\n",numSteps);
	}
	
	// Integrationsbereich
	double xl[] = { 0.,0. };
	double xu[] = { 1.,1. };
	
	// LHAPDF initialisieren
	LHAPDF::PDF* pdf = LHAPDF::mkPDF("MSTW2008lo90cl",0);
	
	// Monte-Carlo anlegen
	MonteCarlo mc(2,numSteps);
	
	// Funktion setzeeen
	MonteCarloFunction mcFunction(diffCrossSection,2,xl,xu,pdf);
	mc.setIntegrationFunction(&mcFunction);
	
	// Integrieren
	double result,error;
	//mc.integrate(&result,&error);
	
	// Ergebnis + Fehler ausgeben
	printf("cross section: %f +/- %f\n",result,error);
	
	// Alternativer Weg über Phasenraum und Matrixelement, dazu Streuprozess-Objekt erstellen
	TwoTwoOneFinalMassiveHadronScattering scattering(M_H,S_PP,M_H,pdf);
	
	// Dem Prozess beitragende einzelne Parton-Prozess registrieren (jeweils Quark-Antiquark)
	for (int i=1;i<7;i++) {
		scattering.addPartonProcess(i,-i,matrixElement);
		scattering.addPartonProcess(-i,i,matrixElement);
	}
	
	// Histogramme für die Verteilungen nach Rapidität und Transversalimpuls anlegen
	PhaseSpaceMonteCarloFunction transverseTransformFunction(scattering.getPhaseSpace(),transverseMomentum,NULL);
	scattering.addHistogram("transverseMomentum","Transverse Momentum",50,0.,1000.,&transverseTransformFunction);
	
	PhaseSpaceMonteCarloFunction rapidityTransformFunction(scattering.getPhaseSpace(),rapidity,NULL);
	scattering.addHistogram("rapidity","rapidity",50,-5.,5.,&rapidityTransformFunction);
	
	// Integrieren und Ergebnis ausgeben
	scattering.getCrossSection(&result,&error,numSteps);
	printf("cross section: %f +/- %f\n",result,error);
	
	// Histogramme zu Root-Histogrammen konvertieren
	Histogram* transverseMomentumHistogram = scattering.getHistogram("transverseMomentum");
	Histogram* rapidityHistogram = scattering.getHistogram("rapidity");
	TH1D* transverseRootHist = transverseMomentumHistogram->getRootTH1D();
	TH1D* rapidityRootHist = rapidityHistogram->getRootTH1D();
	
	// Histogramm in Root-File abspeichern
	TFile* file = new TFile("hist.root","RECREATE");
	transverseRootHist->Write();
	rapidityRootHist->Write();
	file->Close();
	
	// Speicher freigeben
	delete transverseRootHist;
	delete rapidityRootHist;
	delete file;
	
	return 0;
}