early release of the multi threaded Crusher and minor fixes
This commit is contained in:
		
							parent
							
								
									a4ef471926
								
							
						
					
					
						commit
						bc6cb23d47
					
				
							
								
								
									
										7
									
								
								BM1D.cc
								
								
								
								
							
							
						
						
									
										7
									
								
								BM1D.cc
								
								
								
								
							| 
						 | 
				
			
			@ -71,7 +71,7 @@ int main(int argc, char* argv[])
 | 
			
		|||
        rat=0.9;
 | 
			
		||||
 | 
			
		||||
		percent = 0.99; 
 | 
			
		||||
		nGenerated = 8000;
 | 
			
		||||
		nGenerated = 4000;
 | 
			
		||||
		nop = 30;
 | 
			
		||||
		
 | 
			
		||||
		vis = 1;
 | 
			
		||||
| 
						 | 
				
			
			@ -114,7 +114,10 @@ int main(int argc, char* argv[])
 | 
			
		|||
	Plotter* myPlotter = new Plotter(vis==1);
 | 
			
		||||
	myPlotter->Plot(nRuns, nSteps, myBM1DProcess->GetT(), myBM1DProcess->GetX()); 
 | 
			
		||||
  
 | 
			
		||||
  Draw2D *myDraw2D = new Draw2D(nop, percent, nGenerated, myBM1DProcess->GetT(), myBM1DProcess->GetX()); //nop percent nruns
 | 
			
		||||
  //int numCPU = sysconf(_SC_NPROCESSORS_ONLN);
 | 
			
		||||
  //std::cout <<"cpus:"<<numCPU <<std::endl;
 | 
			
		||||
  
 | 
			
		||||
  Draw2D *myDraw2D = new Draw2D(nop, percent, nGenerated, myBM1DProcess->GetT(), myBM1DProcess->GetX(),2); //nop percent nruns
 | 
			
		||||
  
 | 
			
		||||
  switch(random_type){
 | 
			
		||||
  	case 'g' :
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										2
									
								
								BM1D.cc_
								
								
								
								
							
							
						
						
									
										2
									
								
								BM1D.cc_
								
								
								
								
							| 
						 | 
				
			
			@ -39,7 +39,7 @@ int main(int argc, char* argv[])
 | 
			
		|||
    {
 | 
			
		||||
        //default runs with less parameters
 | 
			
		||||
		random_type = 'g';
 | 
			
		||||
		nSteps = 1000;
 | 
			
		||||
		nSteps = 100;
 | 
			
		||||
		nRuns = 1;
 | 
			
		||||
		p0 = 0.5;
 | 
			
		||||
		p1 = 0;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,21 +6,27 @@
 | 
			
		|||
#include <cmath>
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
#include <pthread.h>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "Analyse.hh"
 | 
			
		||||
#include "Lattice.hh"
 | 
			
		||||
#include "Crusher.hh"
 | 
			
		||||
#include "Plotter.hh"
 | 
			
		||||
#include "Draw2DWorkerThread.hh"
 | 
			
		||||
 | 
			
		||||
#include "TH2.h"
 | 
			
		||||
#include "TCanvas.h"
 | 
			
		||||
#include "TGraph.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Draw2D
 | 
			
		||||
{
 | 
			
		||||
	public:
 | 
			
		||||
		
 | 
			
		||||
		Draw2D(int nop, double percent, int nRunsp, std::vector<Double_t> tp, std::vector<Double_t> xp);
 | 
			
		||||
		Draw2D(int nop, double percent, int nRunsp, std::vector<Double_t> tp, std::vector<Double_t> xp, int nThreads_);
 | 
			
		||||
        ~Draw2D();
 | 
			
		||||
		
 | 
			
		||||
		void Histo2D();
 | 
			
		||||
| 
						 | 
				
			
			@ -30,6 +36,8 @@ class Draw2D
 | 
			
		|||
		std::vector<Double_t> x;
 | 
			
		||||
		int nRuns;
 | 
			
		||||
		
 | 
			
		||||
		int nThreads;
 | 
			
		||||
		
 | 
			
		||||
		Analyse *myAnalyse;
 | 
			
		||||
		Crusher *myCrusher;
 | 
			
		||||
		Lattice *myLattice;
 | 
			
		||||
| 
						 | 
				
			
			@ -39,5 +47,7 @@ class Draw2D
 | 
			
		|||
		TH2D *BM1D_histo2;
 | 
			
		||||
		TGraph *gr;
 | 
			
		||||
		
 | 
			
		||||
		struct graphArray graphArray;
 | 
			
		||||
		
 | 
			
		||||
		
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,71 @@
 | 
			
		|||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <string>
 | 
			
		||||
#include <fstream>
 | 
			
		||||
#include <cmath>
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
#include <pthread.h>
 | 
			
		||||
 | 
			
		||||
#include "Lattice.hh"
 | 
			
		||||
#include "Crusher.hh"
 | 
			
		||||
 | 
			
		||||
#include "TH2.h"
 | 
			
		||||
#include "TCanvas.h"
 | 
			
		||||
#include "TGraph.h"
 | 
			
		||||
 | 
			
		||||
typedef void * (*THREADFUNCPTR)(void *);
 | 
			
		||||
 | 
			
		||||
struct graphArray
 | 
			
		||||
 {
 | 
			
		||||
   double *X;
 | 
			
		||||
   double *Y;
 | 
			
		||||
   int size;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class Draw2DWorkerThread
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
	Draw2DWorkerThread(int jobOffset_, int jobSize_, std::vector<Double_t> x_, std::vector<Double_t> t_, int nRuns_, Lattice *myLattice_, TH2D *BM1D_histo_, TH2D *BM1D_histo2_, struct graphArray graphArray_,  pthread_mutex_t *histoMutex_);
 | 
			
		||||
 
 | 
			
		||||
	~Draw2DWorkerThread();
 | 
			
		||||
	
 | 
			
		||||
	void WorkerFunction();
 | 
			
		||||
 
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
	//output histo pointers
 | 
			
		||||
	TH2D *BM1D_histo;
 | 
			
		||||
	TH2D *BM1D_histo2;
 | 
			
		||||
	
 | 
			
		||||
	//lattice instance pointer
 | 
			
		||||
	Lattice *myLattice;
 | 
			
		||||
	
 | 
			
		||||
	int nRuns;   //Chrusher parameter number of tested "kukac"
 | 
			
		||||
	
 | 
			
		||||
	std::vector<Double_t> t;  //original "kukac"
 | 
			
		||||
	std::vector<Double_t> x;
 | 
			
		||||
	
 | 
			
		||||
	Crusher *myCrusher;
 | 
			
		||||
	
 | 
			
		||||
	 pthread_mutex_t *histoMutex;
 | 
			
		||||
	 
 | 
			
		||||
	 //lattice parameters
 | 
			
		||||
	double XbinSize;
 | 
			
		||||
	double YbinSize;
 | 
			
		||||
	double XbinSizePer2;
 | 
			
		||||
	double YbinSizePer2;
 | 
			
		||||
	int    latticeHeight;
 | 
			
		||||
	int    latticeWidth;
 | 
			
		||||
	double latticeMuMin;
 | 
			
		||||
	double latticeSigmaMin;
 | 
			
		||||
	
 | 
			
		||||
	int jobOffset;
 | 
			
		||||
	int jobSize;
 | 
			
		||||
	
 | 
			
		||||
	struct graphArray graphArray;
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			@ -1,17 +1,17 @@
 | 
			
		|||
#include "Draw2D.hh"
 | 
			
		||||
 | 
			
		||||
Draw2D::Draw2D(int nop, double percent, int nRunsp, std::vector<Double_t> tp, std::vector<Double_t> xp) //int nop, double percent, int nRunsp, std::vector<Double_t> tp, std::vector<Double_t> xp
 | 
			
		||||
 | 
			
		||||
Draw2D::Draw2D(int nop, double percent, int nRunsp, std::vector<Double_t> tp, std::vector<Double_t> xp, int nThreads_) //int nop, double percent, int nRunsp, std::vector<Double_t> tp, std::vector<Double_t> xp
 | 
			
		||||
{
 | 
			
		||||
	t = tp;
 | 
			
		||||
	x = xp;
 | 
			
		||||
	nRuns = nRunsp;
 | 
			
		||||
	
 | 
			
		||||
	nThreads =  nThreads_;
 | 
			
		||||
 | 
			
		||||
	myAnalyse = new Analyse();
 | 
			
		||||
	myAnalyse -> AnalyseGaus(t,x);
 | 
			
		||||
 | 
			
		||||
	myCrusher = new Crusher(t,x);
 | 
			
		||||
	
 | 
			
		||||
	myLattice = new Lattice();
 | 
			
		||||
	
 | 
			
		||||
	myLattice -> SetNop(nop);
 | 
			
		||||
| 
						 | 
				
			
			@ -25,7 +25,12 @@ Draw2D::Draw2D(int nop, double percent, int nRunsp, std::vector<Double_t> tp, st
 | 
			
		|||
	
 | 
			
		||||
	BM1D_histo = new TH2D("BM1D_histo", "BM1D_histo", myLattice -> GetWidth() , myLattice -> GetMuMin(), (myLattice -> GetMuMax()) , myLattice -> GetHeight() ,  myLattice -> GetSigmaMin(),  (myLattice -> GetSigmaMax()) );
 | 
			
		||||
	BM1D_histo2 = new TH2D("BM1D_histo2", "BM1D_histo2",  myLattice -> GetWidth() , myLattice -> GetMuMin(), (myLattice -> GetMuMax()) , myLattice -> GetHeight() ,  myLattice -> GetSigmaMin(),  (myLattice -> GetSigmaMax()) );
 | 
			
		||||
    gr = new TGraph();
 | 
			
		||||
    
 | 
			
		||||
	graphArray.size = myLattice -> GetLatticeSize();
 | 
			
		||||
	graphArray.X    = new double[graphArray.size];
 | 
			
		||||
	graphArray.Y    = new double[graphArray.size];
 | 
			
		||||
	
 | 
			
		||||
	gr = new TGraph(graphArray.size);
 | 
			
		||||
	
 | 
			
		||||
	delete myAnalyse;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -44,47 +49,69 @@ Draw2D::~Draw2D()
 | 
			
		|||
	delete gr;
 | 
			
		||||
	
 | 
			
		||||
	delete myLattice;
 | 
			
		||||
	delete myCrusher;
 | 
			
		||||
	 
 | 
			
		||||
	delete[] graphArray.X;
 | 
			
		||||
	delete[] graphArray.Y;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void Draw2D::Histo2D()
 | 
			
		||||
{
 | 
			
		||||
	double XbinSize = (myLattice -> GetMuMax() - myLattice -> GetMuMin())/ myLattice -> GetWidth() ;
 | 
			
		||||
	double YbinSize =( myLattice -> GetSigmaMax() -  myLattice -> GetSigmaMin() ) / myLattice -> GetHeight();
 | 
			
		||||
	
 | 
			
		||||
	double graphArrayX[myLattice -> GetLatticeSize()] = {};
 | 
			
		||||
	double graphArrayY[myLattice -> GetLatticeSize()] = {}; 
 | 
			
		||||
	
 | 
			
		||||
	std::cout << "maxSigma:" <<  myLattice -> GetSigmaMax() << std::endl;
 | 
			
		||||
	std::cout << "maxMu:" <<   myLattice -> GetMuMax() << std::endl;
 | 
			
		||||
	std::cout << "minSigma:" <<  myLattice -> GetSigmaMin() << std::endl;
 | 
			
		||||
	std::cout << "minMu:" <<   myLattice -> GetMuMin() << std::endl;
 | 
			
		||||
	
 | 
			
		||||
	for(int i = 0; i < 	(myLattice -> GetLatticeSize()); i++) 
 | 
			
		||||
	
 | 
			
		||||
	pthread_t thread[2];
 | 
			
		||||
	Draw2DWorkerThread *worker[2];
 | 
			
		||||
	
 | 
			
		||||
    pthread_attr_t attr;
 | 
			
		||||
	
 | 
			
		||||
	pthread_mutex_t histoMutex;
 | 
			
		||||
	pthread_mutex_init(&histoMutex, NULL);
 | 
			
		||||
    int rc;
 | 
			
		||||
 | 
			
		||||
    void *status;
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	worker[0] = new Draw2DWorkerThread(0, (myLattice -> GetLatticeSize()/2), x, t, nRuns, myLattice, BM1D_histo, BM1D_histo2, graphArray, &histoMutex);
 | 
			
		||||
	worker[1] = new Draw2DWorkerThread((myLattice -> GetLatticeSize()/2), (myLattice -> GetLatticeSize()/2), x, t, nRuns, myLattice, BM1D_histo, BM1D_histo2, graphArray, &histoMutex);
 | 
			
		||||
	
 | 
			
		||||
    pthread_attr_init(&attr);
 | 
			
		||||
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
 | 
			
		||||
 | 
			
		||||
    for(int i=0; i<2; i++)
 | 
			
		||||
	{
 | 
			
		||||
			std::cout<<"progress: "<<i<<"/"<<myLattice -> GetLatticeSize()<<"point\n";
 | 
			
		||||
			
 | 
			
		||||
			if(myCrusher -> RunMachine(nRuns, myLattice -> GetMuSigma(i)))
 | 
			
		||||
       std::cout<<"creating thread:"<<i<<std::endl;
 | 
			
		||||
       rc = pthread_create(&thread[i], &attr, (THREADFUNCPTR) &Draw2DWorkerThread::WorkerFunction, (void *)worker[i]);  
 | 
			
		||||
       if (rc) 
 | 
			
		||||
	   {
 | 
			
		||||
					BM1D_histo -> Fill((i /  myLattice -> GetHeight()) * XbinSize + (XbinSize/2) + myLattice -> GetMuMin(),(i % myLattice -> GetHeight()) * YbinSize + (YbinSize/2) + myLattice -> GetSigmaMin() );
 | 
			
		||||
					BM1D_histo2 -> Fill((i /  myLattice -> GetHeight()) * XbinSize + (XbinSize/2) + myLattice -> GetMuMin(),(i % myLattice -> GetHeight()) * YbinSize + (YbinSize/2) + myLattice -> GetSigmaMin());
 | 
			
		||||
					
 | 
			
		||||
					graphArrayX[i] = (i /  myLattice -> GetHeight()) * XbinSize;
 | 
			
		||||
					graphArrayY[i] = (i % myLattice -> GetHeight()) * YbinSize;
 | 
			
		||||
						
 | 
			
		||||
          std::cout<<"ERROR; pthread:"<<i<<"create failed!"<<std::endl;
 | 
			
		||||
		  exit(-1);
 | 
			
		||||
       }
 | 
			
		||||
    }
 | 
			
		||||
	
 | 
			
		||||
		}
 | 
			
		||||
    pthread_attr_destroy(&attr);
 | 
			
		||||
	
 | 
			
		||||
    for(int i=0; i<2; i++)
 | 
			
		||||
	{
 | 
			
		||||
       rc = pthread_join(thread[i], &status);
 | 
			
		||||
       if (rc) 
 | 
			
		||||
	   {
 | 
			
		||||
          std::cout<<"ERROR; pthread:"<<i<<"join failed!"<<std::endl;
 | 
			
		||||
          exit(-1);
 | 
			
		||||
       }
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	std::cout << "RunMachine done" << std::endl;
 | 
			
		||||
		
 | 
			
		||||
	//TGraph *gr = new TGraph(myLattice -> GetLatticeSize(),graphArrayX,graphArrayY);
 | 
			
		||||
		
 | 
			
		||||
	gr -> SetMarkerColor(46);	
 | 
			
		||||
	canvasB2 -> cd();
 | 
			
		||||
	//gr -> LineStyle()
 | 
			
		||||
	gr -> DrawGraph(myLattice -> GetLatticeSize(),graphArrayX,graphArrayY,"AP*");
 | 
			
		||||
	gr -> DrawGraph(graphArray.size, graphArray.X, graphArray.Y, "AP*");
 | 
			
		||||
 | 
			
		||||
	BM1D_histo -> SetMarkerStyle(kFullCircle);
 | 
			
		||||
	BM1D_histo-> SetMarkerStyle(21);
 | 
			
		||||
| 
						 | 
				
			
			@ -94,5 +121,6 @@ void Draw2D::Histo2D()
 | 
			
		|||
	canvasB -> cd(2);	
 | 
			
		||||
	BM1D_histo2 -> Draw("COLZ");
 | 
			
		||||
 | 
			
		||||
	std::cout << "Histo done" << std::endl;
 | 
			
		||||
	std::cout << "Histo draw done" << std::endl;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,67 @@
 | 
			
		|||
#include "Draw2DWorkerThread.hh"
 | 
			
		||||
 | 
			
		||||
Draw2DWorkerThread::Draw2DWorkerThread(int jobOffset_, int jobSize_, std::vector<Double_t> x_, std::vector<Double_t> t_, int nRuns_, Lattice *myLattice_, TH2D *BM1D_histo_, TH2D *BM1D_histo2_, struct graphArray graphArray_, pthread_mutex_t *histoMutex_)
 | 
			
		||||
{
 | 
			
		||||
	std::cout << "Draw2DWorkerThread::Draw2DWorkerThread" <<std::endl;
 | 
			
		||||
	//copy to private variables
 | 
			
		||||
	x = x_;
 | 
			
		||||
	t = t_;
 | 
			
		||||
	
 | 
			
		||||
	myLattice = myLattice_;
 | 
			
		||||
	
 | 
			
		||||
	BM1D_histo  = BM1D_histo_;
 | 
			
		||||
	BM1D_histo2 =BM1D_histo2_;
 | 
			
		||||
	graphArray = graphArray_;
 | 
			
		||||
	
 | 
			
		||||
	nRuns = nRuns_;
 | 
			
		||||
	
 | 
			
		||||
	histoMutex = histoMutex_;
 | 
			
		||||
	
 | 
			
		||||
	jobOffset = jobOffset_;
 | 
			
		||||
	jobSize = jobSize_;
 | 
			
		||||
	
 | 
			
		||||
	//create Crusher instance
 | 
			
		||||
	myCrusher = new Crusher(t,x);
 | 
			
		||||
	
 | 
			
		||||
	//calculate lattice parameters  TODO rework lattice class!!
 | 
			
		||||
	XbinSize = (myLattice -> GetMuMax() - myLattice -> GetMuMin())/ myLattice -> GetWidth() ;
 | 
			
		||||
	YbinSize =( myLattice -> GetSigmaMax() -  myLattice -> GetSigmaMin() ) / myLattice -> GetHeight();
 | 
			
		||||
	XbinSizePer2  	= XbinSize/2;
 | 
			
		||||
	YbinSizePer2  	= YbinSize/2;
 | 
			
		||||
	latticeHeight 	= myLattice -> GetHeight();
 | 
			
		||||
	latticeWidth 	= myLattice -> GetWidth();
 | 
			
		||||
	latticeMuMin 	= myLattice -> GetMuMin();
 | 
			
		||||
	latticeSigmaMin	= myLattice -> GetSigmaMin();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Draw2DWorkerThread::~Draw2DWorkerThread()
 | 
			
		||||
{
 | 
			
		||||
	delete myCrusher;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void Draw2DWorkerThread::WorkerFunction()
 | 
			
		||||
{
 | 
			
		||||
	std::cout << "Draw2DWorkerThread::WorkerFunction" <<std::endl;
 | 
			
		||||
	std::cout << "jobOffset:"<< jobOffset<< "jobSize:"  << jobSize <<std::endl;
 | 
			
		||||
	for(int i = jobOffset; i < (jobOffset + jobSize); i++) 
 | 
			
		||||
		{
 | 
			
		||||
			std::cout<<"progress: "<<i<<"/"<<myLattice -> GetLatticeSize()<<"point\n";
 | 
			
		||||
			
 | 
			
		||||
			if(myCrusher -> RunMachine(nRuns, myLattice -> GetMuSigma(i)))
 | 
			
		||||
				{
 | 
			
		||||
				    pthread_mutex_lock (histoMutex);  //fill histo thread safe???
 | 
			
		||||
    
 | 
			
		||||
					BM1D_histo  ->Fill((i / latticeHeight) * XbinSize + XbinSizePer2 + latticeMuMin, (i % latticeHeight) * YbinSize + YbinSizePer2 + latticeSigmaMin );
 | 
			
		||||
					BM1D_histo2 ->Fill((i / latticeHeight) * XbinSize + XbinSizePer2 + latticeMuMin, (i % latticeHeight) * YbinSize + YbinSizePer2 + latticeSigmaMin );
 | 
			
		||||
					
 | 
			
		||||
					graphArray.X[i] = (i / latticeHeight) * XbinSize;
 | 
			
		||||
					graphArray.Y[i] = (i %  latticeHeight)* YbinSize;
 | 
			
		||||
					
 | 
			
		||||
					pthread_mutex_unlock (histoMutex);
 | 
			
		||||
						
 | 
			
		||||
				}
 | 
			
		||||
		}		
 | 
			
		||||
 pthread_exit((void*) 0);  //kell?? vagy NULL??	
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -105,7 +105,7 @@ void Lattice::SetLattice(Double_t mu_est, Double_t sigma_est){
 | 
			
		|||
				ms_vect[i].mu = loc_mu;
 | 
			
		||||
				ms_vect[i].sigma = loc_sigma;
 | 
			
		||||
				
 | 
			
		||||
				std::cout << "i :  " << ms_vect[i].mu << " " << ms_vect[i].sigma << std::endl;
 | 
			
		||||
				//std::cout << "i :  " << ms_vect[i].mu << " " << ms_vect[i].sigma << std::endl;
 | 
			
		||||
			
 | 
			
		||||
				i++;
 | 
			
		||||
				loc_sigma += ds;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue