int RampCorrellation_single(std::string file_name, TGraphErrors &graph, TGraphErrors &graph2, vector<double> &vec_errors) { TTree *t = new TTree(); const std::string file_path = "/home/jlab/github/MagCloak_Analysis/calibration/data-calib/DATA_MegaVIEW/"; // std::string file_name = "DataFile_2016-12-08_06-59-11.csv"; std::string file = file_path+file_name; t->ReadFile(file.c_str()); // t->Print(); TCanvas *c = new TCanvas(); t->Draw("TMath::Abs(B1/B2):time"); TGraph *gh = (TGraph*)c->GetListOfPrimitives()->FindObject("Graph"); double ratio_mean = gh->GetMean(2); double ratio_std = gh->GetRMS(2); t->Draw("Bnom:time"); TGraph *gh1 = (TGraph*)c->GetListOfPrimitives()->FindObject("Graph"); double nom_mean = gh1->GetMean(2); double nom_std = 0; // cout << "At " << nom_mean << " mT, B1/B2 is: " << ratio_mean << " +/- " << ratio_std << endl; c->Close(); int n = graph.GetN(); graph.SetPoint(n,nom_mean,ratio_mean); graph.SetPointError(n,nom_std,ratio_std); //------------------------------------------------------------------------------- TCanvas *c2 = new TCanvas(); t->Draw("B3:time"); TGraph *gh2 = (TGraph*)c2->GetListOfPrimitives()->FindObject("Graph"); double B3_mean = -1*(gh2->GetMean(2)); double B3_std = gh2->GetRMS(2); int n2 = graph2.GetN(); graph2.SetPoint(n2, nom_mean, B3_mean); graph2.SetPointError(n2, nom_std, B3_std); c2->Close(); if(nom_mean < 500) vec_errors.push_back(B3_std); return 0; }
/// used in display_beamprofile() : not working ! void getEllipseParameters(const float * x_data, const float * y_data, const unsigned int N, float& x_width, float& y_width, float& angle) { // In order to fit a good ellipse on the scattered plot : // 1) The TH2 is copied into a TGraph, to fit it with y(x) = ax => to retrieve the angle // 2) Rotation of the Graph to get the RMS in X and Y // 3) Creation of the final ellipse, with the good widths and angle TCanvas * ca0 = new TCanvas; ca0->Divide(2,1); ca0->cd(1); TGraph * draft = new TGraph(N,x_data,y_data); draft->Draw("AP"); draft->Fit("pol1","Q"); TF1 * pol1 = draft->GetFunction("pol1"); pol1->Draw("same"); // gets the angle [rad] angle = asin(1.) - atan(pol1->GetParameter(1)); double x_datarot[N], y_datarot[N]; for (unsigned int i=0; i<N; i++) { x_datarot[i]= x_data[i]*cos(angle) - y_data[i]*sin(angle); y_datarot[i]= x_data[i]*sin(angle) + y_data[i]*cos(angle); } ca0->cd(2); TGraph * draft2 = new TGraph(N,x_datarot,y_datarot); draft2->Draw("AP"); x_width = draft2->GetRMS(1); y_width = draft2->GetRMS(2); angle = 180-90*angle/asin(1.); // draft->Draw("AP"); ca0->cd(1); TEllipse * ell = new TEllipse(draft->GetMean(1),draft2->GetMean(2),x_width*3,y_width*3); ell->SetTheta(angle); ell->Draw("same"); //cout << "x = " << x_width << "\t y = " << y_width << "\t angle = " << angle << endl; // delete draft2; // delete draft; // delete ca0; return; }
double thetaOpt2(double *par){ int upperAntNums[NUM_PHI]={8,0,9,1,10,2,11,3,12,4,13,5,14,6,15,7}; int lowerAntNums[NUM_PHI]={16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31}; int lowerAntFromUpper[NUM_PHI]={17,19,21,23,25,27,29,31,16,18,20,22,24,26,28,30}; int nadirAntNums[NUM_PHI]={32,-1,33,-1,34,-1,35,-1,36,-1,37,-1,38,-1,39,-1}; int bottomFromNadir[8]={16,18,20,22,24,26,28,30}; Double_t deltaR[40]={0}; Double_t deltaZ[40]={0}; Double_t deltaPhi[40]={0}; Double_t deltaHeading[1]={0}; double deltaTArrayMod[40]={0}; int count3 = 0; // for(int i = 0; i<32;i++){ // deltaR[i]=par[i]; // deltaZ[i]=par[i+32]; // deltaPhi[i]=par[i+64]; // cout << i << " " <<0 << " " << deltaR[i] << " " << deltaPhi[i] << " " << deltaZ[i] << endl; // } for(int i = 7; i<8;i++){ deltaR[7]=par[0]; deltaZ[7]=par[1]; deltaPhi[7]=par[2]; cout << i << " " <<0 << " " << deltaR[i] << " " << deltaPhi[i] << " " << deltaZ[i] << endl; } // for(int i = 0; i<16;i++){ // deltaPhi[i]=deltaPhi[i] + par[16]; // deltaPhi[i+16]=deltaPhi[i+16] + par[17]; // } double theReturn = 0; double sumMean = 0; double sumMean2 = 0; int count8 = 0; double sumGrads = 0; TMultiGraph *myMG = new TMultiGraph; TMultiGraph *myMG3 = new TMultiGraph; TMultiGraph *myMG2 = new TMultiGraph;; AnitaGeomTool *fGeomTool = AnitaGeomTool::Instance(); char eventName[FILENAME_MAX]; char headerName[FILENAME_MAX]; char hkName[FILENAME_MAX]; char gpsName[FILENAME_MAX]; char corrName[FILENAME_MAX]; char outName[FILENAME_MAX]; char baseDir[FILENAME_MAX]; char *corTreeDir = "../../../Outfiles"; double dummyArray[40][1] ={{0}}; TGraph *tempAntGraph; vector<vector<double> > phiAngle; vector<vector<double> > deltaTVec; vector<vector<int> > firstAntVec; vector<vector<int> > secondAntVec; vector<vector<double> > phiAngleArray2; vector<vector<double> > deltaTArray2; vector<double> temp; vector<int> temp2; temp.push_back(0); temp2.push_back(0); double deltaTArrayLoop[6000] ={0}; double phiAngleArrayLoop[6000] = {0}; int leftOpt, rightOpt; double meanPhi[40] = {0}; meanPhi[0] =22.5-12.5; meanPhi[1] =67.5-12.5; meanPhi[2] =112.5-12.5; meanPhi[3] =157.5-12.5; meanPhi[4] =202.5-12.5; meanPhi[5] =247.5-12.5; meanPhi[6] =292.5-12.5; meanPhi[7] =337.5-12.5; meanPhi[8] =45-12.5; meanPhi[9] =90-12.5; meanPhi[10] =135-12.5; meanPhi[11] =180-12.5; meanPhi[12] =225-12.5; meanPhi[13] =270-12.5; meanPhi[14] =315-12.5; meanPhi[15] =360-12.5; meanPhi[16] = 22.5-12.5; meanPhi[17] = 45-12.5; meanPhi[18] = 67.5-12.5; meanPhi[19] = 90-12.5; meanPhi[20] = 112.5-12.5; meanPhi[21] = 135-12.5; meanPhi[22] = 157.5-12.5; meanPhi[23] = 180-12.5; meanPhi[24] = 202.5-12.5; meanPhi[25] = 225-12.5; meanPhi[26] = 247.5-12.5; meanPhi[27] = 270-12.5; meanPhi[28] = 292.5-12.5; meanPhi[29] = 315-12.5; meanPhi[30] = 337.5-12.5; meanPhi[31] = 360-12.5; meanPhi[32] = 22.5-12.5; meanPhi[33] = 67.5-12.5; meanPhi[34] = 112.5-12.5; meanPhi[35] = 157.5-12.5; meanPhi[36] = 202.5-12.5; meanPhi[37] = 247.5-12.5; meanPhi[38] = 292.5-12.5; meanPhi[39] = 337.5-12.5; for(int i =0; i < 40; i++){ phiAngleArray2.push_back(temp); deltaTArray2.push_back(temp); } for(int loop = 1; loop <4; loop++){ int run = 16+loop; //int run = 18; canSurf->cd(loop+1); phiAngle.clear(); deltaTVec.clear(); firstAntVec.clear(); secondAntVec.clear(); for(int i = 0; i < 40; i++){ phiAngle.push_back(temp); deltaTVec.push_back(temp); firstAntVec.push_back(temp2); secondAntVec.push_back(temp2); } //sprintf(baseDir,"http://www.hep.ucl.ac.uk/uhen/anita/private/monitor2/runs/fromLoki/"); sprintf(baseDir,"/Users/simonbevan/Desktop/"); sprintf(eventName,"%s/run%d/eventFile%d.root",baseDir,run,run); sprintf(headerName,"%s/run%d/headFile%d.root",baseDir,run,run); sprintf(gpsName,"%s/run%d/gpsFile%d.root",baseDir,run,run); sprintf(corrName,"%s/corRun%d.root",corTreeDir,run); RawAnitaEvent *event = 0; PrettyAnitaHk *hk = 0; RawAnitaHeader *header =0; Adu5Pat *pat =0; CorrelationSummary *corSum =0; TFile *fpHead = TFile::Open(headerName); TTree *headTree = (TTree*) fpHead->Get("headTree"); headTree->SetBranchAddress("header",&header); headTree->BuildIndex("eventNumber"); TFile *fpGps = TFile::Open(gpsName); TTree *adu5PatTree = (TTree*) fpGps->Get("adu5PatTree"); adu5PatTree->BuildIndex("realTime"); adu5PatTree->SetBranchAddress("pat",&pat); Int_t labChip; TFile *fpCor = new TFile(corrName); TTree *corTree = (TTree*) fpCor->Get("corTree"); corTree->SetBranchAddress("cor",&corSum); corTree->SetBranchAddress("labChip",&labChip); Long64_t numEntries=corTree->GetEntries(); int counter=0; Long64_t entry=0; UInt_t eventNumber, triggerTime, triggerTimeNs; Int_t firstAnt,secondAnt,maxAnt,corInd; Double_t deltaT,deltaTExpected; Double_t phiWave, phiMaxAnt; Double_t corPeak, corRMS; Double_t balloonLat, balloonLon, balloonAlt; Double_t heading,pitch,roll; Double_t thetaWave; for(entry=0;entry<numEntries;entry++) { corTree->GetEntry(entry); Long64_t headEntry=headTree->GetEntryNumberWithIndex(corSum->eventNumber); if(headEntry<0) continue; headTree->GetEntry(headEntry); if( (header->triggerTimeNs>0.5e6) || (header->triggerTimeNs<0.2e6) ) continue; triggerTimeNs=header->triggerTimeNs; triggerTime=header->triggerTime; eventNumber=header->eventNumber; Long64_t bestEntry = adu5PatTree->GetEntryNumberWithBestIndex(header->triggerTime); if(bestEntry>-1) adu5PatTree->GetEntry(bestEntry); else continue; balloonLat=pat->latitude; balloonLon=pat->longitude; balloonAlt=pat->altitude; heading=pat->heading; pat->pitch=0.64; pat->roll=0.14; pitch=pat->pitch; roll=pat->roll; UsefulAdu5Pat usefulPat(pat); for(corInd=0;corInd<19;corInd++) { firstAnt=corSum->firstAnt[corInd]; secondAnt=corSum->secondAnt[corInd]; //replace taylor dome usefulPat.fSourceLongitude=0; // deltaTExpected=usefulPat.getDeltaTTaylor(corSum->firstAnt[corInd],corSum->secondAnt[corInd]); deltaTExpected=usefulPat.getDeltaTTaylorOpt(corSum->firstAnt[corInd],corSum->secondAnt[corInd],deltaR,deltaZ,deltaPhi); deltaT=corSum->maxCorTimes[corInd]; maxAnt=corSum->centreAntenna; phiWave=usefulPat.getPhiWave()*TMath::RadToDeg(); phiMaxAnt=fGeomTool->getAntPhiPositionRelToAftFore(corSum->centreAntenna)*TMath::RadToDeg(); corPeak=corSum->maxCorVals[corInd]; corRMS=corSum->rmsCorVals[corInd]; if((deltaT - deltaTExpected)*(deltaT - deltaTExpected) < 1 && (corPeak/corRMS)>8 ){ phiAngle[0].push_back(phiWave); deltaTVec[0].push_back(deltaT - deltaTExpected + deltaTArrayMod[firstAnt] - deltaTArrayMod[secondAnt]); firstAntVec[0].push_back(firstAnt); secondAntVec[0].push_back(secondAnt); } } counter++; } double deltaTArray[40][3000] = {{0}}; double phiAngleArray[40][3000]= {{0}}; double deltaTArrayCut[40][3000]= {{0}}; double phiAngleArrayCut[40][3000]= {{0}}; int whichCut[40][3000] = {{0}}; int middleAnt; int leftAnt,rightAnt; int countArray[40] = {0}; //fill arrays //for(int ants = par[0]; ants < par[0]+1; ants++){ for(int ants = 0; ants < 32; ants++){ double lower = meanPhi[ants] - 20; double upper = meanPhi[ants] + 10; // double lower = 0; // double upper = 360; if(ants<8){ lower = lower; upper=upper; if(lower < 0){ lower = 0; upper = 20; } if(upper > 360){ lower = 330; upper = 360; } }else if(ants<16){ lower = lower; upper= upper; if(lower < 0){ lower = 330; upper = 355; } if(upper > 360){ lower = 330; upper = 360; } } int count = 0; int count2 = 0; count3 = 0; double sumPhi = 0; bool true1 = false; bool true2 = false; if(ants <32){ fGeomTool->getThetaPartners(ants,leftAnt,rightAnt); }else{ leftAnt = ants; rightAnt = ants +1; if(ants == 39){ leftAnt = ants; rightAnt = 32; } } for(int events = 1; events < phiAngle[0].size(); events++){ int firstAntTemp = (int)firstAntVec[0][events]; int secondAntTemp = (int)secondAntVec[0][events]; int rightTemp = int(rightAnt); int aboveTemp = 0; if(ants <16){ aboveTemp = lowerAntFromUpper[ants]; }else{ aboveTemp = upperAntNums[ants-16]; } if(firstAntTemp < 32){ if( ((firstAntTemp == ants) && (secondAntTemp == rightTemp))){ //if((firstAntTemp == ants) && (secondAntTemp == rightTemp)){ if((phiAngle[0][events] > lower ) && (phiAngle[0][events]< upper)){ deltaTArray[ants][count] = deltaTVec[0][events]; phiAngleArray[ants][count] = phiAngle[0][events]; whichCut[ants][count] = 1; count++; } } else if(((firstAntTemp == ants) && (secondAntTemp == aboveTemp))){ // //if((firstAntTemp == ants) && (secondAntTemp == rightTemp)){ double lower = meanPhi[ants] - 20; double upper = meanPhi[ants] + 10; // double lower = 0; // double upper = 360; if(ants<8){ lower = lower; upper=upper; if(lower < 0){ lower = 0; upper = 20; } if(upper > 360){ lower = 330; upper = 360; } }else if(ants<16){ lower = lower - 45; upper= upper - 45; if(lower < 0){ lower = 330; upper = 355; } if(upper > 360){ lower = 330; upper = 360; } } // if((phiAngleArray[ants][events] > lower ) && (phiAngleArray[ants][events]< upper)){ if((phiAngle[0][events] > lower ) && (phiAngle[0][events]< upper)){ deltaTArray[ants][count] = deltaTVec[0][events]; phiAngleArray[ants][count] = phiAngle[0][events]; whichCut[ants][count] = 0; count++; } } }else{ rightTemp = firstAntTemp+1; if(rightTemp>39){ rightTemp = 32; } if(firstAntTemp == ants){ } if((firstAntTemp == ants) && (secondAntTemp == rightTemp)){ deltaTArray[ants][count] = deltaTVec[0][events]; phiAngleArray[ants][count] = phiAngle[0][events]; whichCut[ants][count] = 3; count++; } } } countArray[ants] = count; } //make cuts for(int ants = 0; ants < 32; ants++){ count3 = 0; if(ants <32){ fGeomTool->getThetaPartners(ants,leftAnt,rightAnt); }else{ leftAnt = ants -1; rightAnt = ants +1; if(ants == 39){ leftAnt = ants - 1; rightAnt = 32; } } double sumPhi = 0; double lower = meanPhi[ants] - 20; double upper = meanPhi[ants] + 10; // double lower = 0; // double upper = 360; if(ants<8){ lower = lower; upper=upper; if(lower < 0){ lower = 0; upper = 20; } if(upper > 360){ lower = 330; upper = 360; } }else if(ants<16){ lower = lower; upper= upper; if(lower < 0){ lower = 330; upper = 355; } if(upper > 360){ lower = 330; upper = 360; } } for(int events = 0; events < countArray[ants]; events++){ // if(whichCut[ants][events]==1){ // lower = meanPhi[ants] - 20; // upper = meanPhi[ants] + 20; // if(lower < 0){ // lower = 0; // upper = 20; // } // if(upper > 360){ // lower = 330; // upper = 360; // } // } // if((phiAngleArray[ants][events] > lower ) && (phiAngleArray[ants][events]< upper)){ phiAngleArrayCut[ants][count3] = phiAngleArray[ants][events]; deltaTArrayCut[ants][count3] = deltaTArray[ants][events]; count3++; // } } for(int events = 0; events < count3-1; events++){ phiAngleArray2[ants].push_back(phiAngleArrayCut[ants][events]); deltaTArray2[ants].push_back(deltaTArrayCut[ants][events]); } } delete event; delete hk; delete header; delete pat; delete corSum; delete fpHead; delete fpGps ; delete fpCor; } sumMean = 0; sumMean2 = 0; sumGrads = 0; for(int ants = 0; ants < 32; ants++){ count8 = 0; for(int events = 1; events < phiAngleArray2[ants].size(); events++){ if( deltaTArrayLoop[count8]<1){ deltaTArrayLoop[count8] = deltaTArray2[ants][events]; phiAngleArrayLoop[count8] = phiAngleArray2[ants][events]; count8++; } } if(count8==0){ tempAntGraph = new TGraph(1, dummyArray[ants], dummyArray[ants]); }else{ tempAntGraph = new TGraph(count8-1, phiAngleArrayLoop, deltaTArrayLoop); if(ants == 7){ canSurf->cd(1); tempAntGraph->SetMinimum(-0.5); tempAntGraph->SetMaximum(0.5); tempAntGraph->Draw("ap"); tempAntGraph->SetMarkerStyle(1); tempAntGraph->GetXaxis()->SetLimits(0,360); sumMean = sumMean + tempAntGraph->GetMean(2)*tempAntGraph->GetMean(2); if(ants == 8 || ants == 16 || ants == 12 || ants == 24){ tempAntGraph->SetMarkerColor(8); } if(ants == 3 || ants == 7 || ants == 23 || ants == 31){ tempAntGraph->SetMarkerColor(1); } if(ants == 9 || ants == 13 || ants == 18 || ants == 26){ tempAntGraph->SetMarkerColor(2); } if(ants == 10 || ants == 14 || ants == 20 || ants == 28){ tempAntGraph->SetMarkerColor(3); } if(ants == 11 || ants == 15 || ants == 22 || ants == 30){ tempAntGraph->SetMarkerColor(4); } if(ants == 0 || ants == 4 || ants == 17 || ants == 25){ tempAntGraph->SetMarkerColor(5); } if(ants == 2 || ants == 6 || ants == 21 || ants == 29){ tempAntGraph->SetMarkerColor(6); } if(ants == 1 || ants == 5 || ants == 19 || ants == 27){ tempAntGraph->SetMarkerColor(7); } tempAntGraph->GetXaxis()->SetTitle("phi (degrees)"); tempAntGraph->GetYaxis()->SetTitle("actual - expected time"); myMG2->Add(tempAntGraph); myMG2->Draw("p"); vector<double> myFit = leastSquares(phiAngleArrayLoop, deltaTArrayLoop, count8-1); double slope = myFit[0]; double intercept = myFit[1]; double tempX[2] = {slope*(meanPhi[ants]-20)+intercept,slope*(meanPhi[ants]+20)+intercept}; double tempY[2] = {(meanPhi[ants]-20),(meanPhi[ants]+20)}; sumGrads = sumGrads + myFit[0]*myFit[0]*10000; } } } cout << " " << endl; cout << sumMean << " " << sumGrads <<endl; canSurf->Update(); cout << " " << endl; theReturn = sumMean+sumGrads; return theReturn; }
void fitcorr(){ setTDRStyle(); TFile *f = new TFile("rootfiles/fitresults_2D_data.root"); TTree *t = (TTree*)f->Get("FitResults"); double mt=0, jsf=0, mcmass=0; t->SetBranchAddress("mt", &mt); t->SetBranchAddress("jesfactor", &jsf); t->SetBranchAddress("mcmass", &mcmass); TH2D *h2D = new TH2D("h2D",";M_{t} [GeV];JSF", 20, 170, 173, 20, 0.99, 1.04 ); TGraph *g = new TGraph(); for( int i=0; i < t->GetEntries(); i++ ){ t->GetEntry(i); //if( mcmass != 172.5 ) continue; h2D->Fill(mt, jsf); g->SetPoint(g->GetN(), mt, jsf); } // uncertainty contour double mean_mt = g->GetMean(1); double mean_jsf = g->GetMean(2); double sigma_mt = g->GetRMS(1); double sigma_jsf = g->GetRMS(2); double rho = g->GetCorrelationFactor(); std::cout << "Mean Mt = " << mean_mt << " +- " << sigma_mt << std::endl; std::cout << "Mean JSF = " << mean_jsf << " +- " << sigma_jsf << std::endl; std::cout << "Correlation = " << rho << std::endl; TMatrixDSym m(2); m(0,0) = sigma_mt*sigma_mt; m(1,1) = sigma_jsf*sigma_jsf; m(0,1) = rho*sigma_mt*sigma_jsf; m(1,0) = rho*sigma_mt*sigma_jsf; TMatrixDSymEigen eigen(m); TVectorD eigenval = eigen.GetEigenValues(); std::cout << eigenval[0] << " " << eigenval[1] << endl; // convert to ellipse tilt and radius //double phi = 0.5*TMath::ATan( (3/0.03)*(2*rho*sigma_mt*sigma_jsf)/(sigma_mt*sigma_mt-sigma_jsf*sigma_jsf) ); double phi = (180.0/TMath::Pi())*0.5*TMath::ATan( (2*rho*sigma_mt*sigma_jsf)/(sigma_mt*sigma_mt-sigma_jsf*sigma_jsf) ); std::cout << "phi = " << phi << std::endl; TEllipse *el = new TEllipse(mean_mt, mean_jsf, sqrt(eigenval[0]), sqrt(eigenval[1]), 0, 360, phi); TEllipse *el2 = new TEllipse(mean_mt, mean_jsf, 2*sqrt(eigenval[0]), 2*sqrt(eigenval[1]), 0, 360, phi); /* TF2* fell = new TF2("fell","pow((x-[1])*cos([0])+(y-[2])*sin([0]),2)/[3] + pow((x-[1])*sin([0])-(y-[2])*cos([0]),2)/[4]",171,174,0.985,1.015); fell->SetParameter(0,phi); fell->SetParameter(1,mean_mt); fell->SetParameter(2,mean_jsf); fell->SetParameter(3,eigenval[0]); fell->SetParameter(4,eigenval[1]); double cont[1] = {1}; fell->SetContour(1, cont); */ const Int_t Number = 2; Double_t Red[Number] = { 0.90, 0.10}; Double_t Green[Number] = { 0.90, 0.10}; Double_t Blue[Number] = { 0.90, 0.10}; Double_t Stops [Number] = {0, 1}; Double_t Length [Number] = {0, 1}; Int_t nb=50; TColor::CreateGradientColorTable(Number,Length,Red,Green,Blue,nb); gStyle->SetPadRightMargin(0.16); gStyle->SetPadTopMargin(0.08); TCanvas *c = new TCanvas("c","c",800,600); h2D->Draw("colzC"); el->SetFillStyle(0); el->SetLineColor(2); el->SetLineWidth(3); el->Draw(); el2->SetFillStyle(0); el2->SetLineColor(2); el2->SetLineWidth(3); el2->Draw(); int iPeriod = 2; int iPos = 33; lumi_sqrtS = "8 TeV"; writeExtraText = false; CMS_lumi( c, iPeriod, iPos ); c->Update(); c->RedrawAxis(); c->GetFrame()->Draw(); TLatex latex; latex.SetNDC(); latex.SetTextSize(0.06); latex.SetTextFont(42); latex.DrawLatex(0.2, 0.84, "2D fit"); c->Print("pdfplots/fitcorr.pdf"); //delete c; return; }