void CCProtonPi0_QSqFitter::FillChiSqVector_W_Shift(bool isSignal)
{
    // Read Files
    std::string data_dir = Folder_List::rootDir_Interaction_data;
    std::string mc_dir = Folder_List::rootDir_Interaction_mc;
   
    TFile* f_data = new TFile(data_dir.c_str());
    TFile* f_mc = new TFile(mc_dir.c_str());

    for (int i = 0; i < 151; ++i){
        // Get Histograms
        MnvH1D* h_data = GetMnvH1D(f_data, Form("%s_%d","W_Shift",i));

        // Background Subtract if Signal
        if (isSignal){
            MnvH1D* h_mc_bckg = GetMnvH1D(f_mc, Form("%s_%d","W_Shift_Bckg",i));
            NormalizeHistogram(h_mc_bckg);
            h_mc_bckg->Scale(2997.1);
            h_data->Add(h_mc_bckg, -1);
            delete h_mc_bckg;
        }

        MnvH1D* h_mc;
        if (isSignal){
            h_mc = GetMnvH1D(f_mc, Form("%s_%d","W_Shift_Signal",i));
        }else{
            h_mc = GetMnvH1D(f_mc, Form("%s_%d","W_Shift",i));
        }

        double ChiSq =  Calc_ChiSq_W_Shift(h_data, h_mc);
        ChiSqVector_W_Shift.push_back(ChiSq);

        // Clean Memory
        delete h_data;
        delete h_mc;
    }

    if (isDebug){
        if (isSignal){
            std::cout<<"ChiSq Vector for W Shift -- Signal Events"<<std::endl;
        }else{
            std::cout<<"ChiSq Vector for W Shift"<<std::endl;
        }
        for (unsigned int i = 0; i < ChiSqVector_W_Shift.size(); ++i){
            std::cout<<"\t"<<i<<" "<<ChiSqVector_W_Shift[i]<<std::endl;
        }
    }

    delete f_data;
    delete f_mc;
}
void MotionCooccurrenceHistogram::Extract(const string& video_path, MotionCooccurrenceHistogram::eMotionCooccurrenceType cType, int nFrameSkip, int nFrameHistory)
{
	vector<vector<double> > vHistNor;
	vector<vector<double> > vecMotionVel, vecMotionAngle;
	vector<vector<pair<int, int> > > vecMotionPosStart, vecMotionPosEnd;
	vector<int> vec_nFrameID;

	// Frame history value
	m_nFrameHistory = nFrameHistory;

	// Define the length of diagonal
	m_dDiagLength = 400;

	MotionVectorExtractor m;
	// Extract motion vector with respect to the given parameters
	m.Extract(video_path, MotionVectorExtractor::MOTION_OPTICAL_FLOW_BM, 0);
	// Get motion vectors to calculate histograms
	m.GetFeature(vecMotionVel, vecMotionAngle, vecMotionPosStart, vecMotionPosEnd, vec_nFrameID);

	/*
	// Write motion vectors to the file
	ofstream outMotionVel("outMotionVel.txt", iostream::app);
	ofstream outMotionAngle("outMotionAngle.txt", iostream::app);
	for (unsigned int i = 0; i < vecMotionVel.size(); i++) {

		for (unsigned int j = 0; j < vecMotionVel[i].size(); j++) {
			
			outMotionVel << vecMotionVel[i][j] << endl;
			outMotionAngle << vecMotionAngle[i][j] << endl;
		}
	}
	outMotionVel.close();
	outMotionAngle.close();
	*/
	StartCounter();

	if (cType == MotionCooccurrenceHistogram::MOTION_COOCCURRENCE_ANGLE)
	{
		vector<map<pair<int, int>, int> > vPositionAngle; // Holds position and quantized angle bin for each frame
		vector<vector<double> > vHistTemp;
		int nAngleBin;

		for (unsigned int f = 0; f<vecMotionAngle.size(); f++)
		{
			map<pair<int, int>, int> mPositionAngleTemp;

			for (unsigned int m = 0; m<vecMotionAngle[f].size(); m++)
			{
				nAngleBin = QuantizeMotionAngle(vecMotionAngle[f][m]);
				mPositionAngleTemp.insert(pair<pair<int, int>, int>(vecMotionPosStart[f][m], nAngleBin));
			}

			vPositionAngle.push_back(mPositionAngleTemp);
		}
		MotionAngleCooccurrence(vPositionAngle, nFrameSkip, vHistTemp);
		NormalizeHistogram(vHistTemp, vHistNor);
	}
	else if (cType == MotionCooccurrenceHistogram::MOTION_COOCCURRENCE_VELOCITY)
	{
		vector<map<pair<int, int>, int> > vPositionVelocity; // Holds position and quantized angle bin for each frame
		vector<vector<double> > vHistTemp;
		int nVelocityBin;
		double unitTime;

		unitTime = 0.04;

		for (unsigned int f = 0; f<vecMotionVel.size(); f++)
		{
			map<pair<int, int>, int> mPositionVelocityTemp;

			for (unsigned int m = 0; m<vecMotionVel[f].size(); m++)
			{
				nVelocityBin = QuantizeMotionVelocity(vecMotionVel[f][m], unitTime);
				mPositionVelocityTemp.insert(pair<pair<int, int>, int>(vecMotionPosStart[f][m], nVelocityBin));
			}

			vPositionVelocity.push_back(mPositionVelocityTemp);
		}

		MotionVelocityCooccurrence(vPositionVelocity, nFrameSkip, vHistTemp);
		//vHistNor = vHistTemp;
		NormalizeHistogram(vHistTemp, vHistNor);
	}
	else if (cType == MotionCooccurrenceHistogram::MOTION_COOCCURRENCE_ANGLE_VELOCITY)
	{
		vector<vector<double> > vAngleHistTemp, vVelocityHistTemp;
		vector<vector<double> > vAngleHistNor, vVelocityHistNor;
		vector<map<pair<int, int>, int> > vPositionAngle, vPositionVelocity;
		int nAngleBin, nVelocityBin;
		double unitTime;

		unitTime = 0.04;

		// Quantize angle and velocity
		for (unsigned int f = 0; f<vecMotionAngle.size(); f++)
		{
			map<pair<int, int>, int> mPositionAngleTemp, mPositionVelocityTemp;

			for (unsigned int m = 0; m<vecMotionAngle[f].size(); m++)
			{
				nAngleBin = QuantizeMotionAngle(vecMotionAngle[f][m]);
				mPositionAngleTemp.insert(pair<pair<int, int>, int>(vecMotionPosStart[f][m], nAngleBin));

				nVelocityBin = QuantizeMotionVelocity(vecMotionVel[f][m], unitTime);
				mPositionVelocityTemp.insert(pair<pair<int, int>, int>(vecMotionPosStart[f][m], nVelocityBin));
			}

			vPositionAngle.push_back(mPositionAngleTemp);
			vPositionVelocity.push_back(mPositionVelocityTemp);
		}

		// Extract MCFs wrt position-angle and position-velocity
		MotionAngleCooccurrence(vPositionAngle, nFrameSkip, vAngleHistTemp);
		//vAngleHistNor = vAngleHistTemp;
		NormalizeHistogram(vAngleHistTemp, vAngleHistNor);

		MotionVelocityCooccurrence(vPositionVelocity, nFrameSkip, vVelocityHistTemp);
		//vVelocityHistNor = vVelocityHistTemp;
		NormalizeHistogram(vVelocityHistTemp, vVelocityHistNor);

		for (unsigned int j = 0; j<vAngleHistNor.size(); j++)
		{
			vector<double> vFeature;

			vFeature = vAngleHistNor[j];
			vFeature.insert(vFeature.end(), vVelocityHistNor[j].begin(), vVelocityHistNor[j].end());

			vHistNor.push_back(vFeature);
		}
	}

	m_vMCH_Video = vHistNor;
	m_vFrameID = vec_nFrameID;

	dElapsedTime = GetCounter();
}