Peakfit.C

From GlueXWiki
Jump to: navigation, search

{
gROOT->Reset();


char adcn_sim[50],file_sim[50],file_jlab[50],histN[50];
float adcmean_sim[18];
int t=0;
char  drawthis[1000] = "(sqrt((";
char  drawthat[500] = " ";
char adccalib[1100] = "Ephoton/";
char adccalib2[20];
char cut1[200];
char adcn[50];
char S1[20],S2[20],S3[20],S4[20],S5[20],S6[20],S7[20],S8[20],S9[20],S10[20],S11[20],S12[20],S13[20],S14[20],S15[20],S16[20],S17[20],S18[20];
char N1[20],N2[20],N3[20],N4[20],N5[20],N6[20],N7[20],N8[20],N9[20],N10[20],N11[20],N12[20],N13[20],N14[20],N15[20],N16[20],N17[20],N18[20];
float adcmeann[18],adcmeans[18],n8ratioN[18],n8ratioS[18],simsclfctrN[18],simsclfctrS[18],adcrmsN[18];
Double_t fitpar[9],chisqr[9],fitndf[9],what;
int k=0;
int m=0;
float gaincor[18],gaincor2[18],epsilon,lastsmall;


ofstream outputfile;
outputfile.open("peakfit.txt");   // text file where the means are output

//// root file
TFile *jlabfile = new TFile("/home/leverin/work/root/dst/bcal_dst02334.root");



//for( int i = 0; i<= 17; i++){
  // gaincor[i] = 1.0;
  // gaincor2[i] = 1.0; 
//}
 fitpar[2] = 1.0;


 //// The correction factors from the last run. Better place to start from.
 gaincor[0] = 0.97;
 gaincor[1] = 0.99;
 gaincor[2] = 1.02;
 gaincor[3] = 0.98;
 gaincor[4] = 0.99;
 gaincor[5] = 0.99;
 gaincor[6] = 0.99;
 gaincor[7] = 0.79;
 gaincor[8] = 1.05;
 gaincor[9] = 0.99;
 gaincor[10] = 1.03;
 gaincor[11] = 0.99;
 gaincor[12] = 1.04;
 gaincor[13] = 0.94;
 gaincor[14] = 0.95;
 gaincor[15] = 1.02;
 gaincor[16] = 1.02;
 gaincor[17] = 0.99;

 gaincor2[0] = 1.02;
 gaincor2[1] = 1.02;
 gaincor2[2] = 1.02;
 gaincor2[3] = 0.99;
 gaincor2[4] = 0.98;
 gaincor2[5] = 1.02;
 gaincor2[6] = 0.98;
 gaincor2[7] = 0.68;
 gaincor2[8] = 1.04;
 gaincor2[9] = 1.11;
 gaincor2[10] = 0.97;
 gaincor2[11] = 1.05;
 gaincor2[12] = 0.99;
 gaincor2[13] = 1.04;
 gaincor2[14] = 0.99;
 gaincor2[15] = 1.03;
 gaincor2[16] = 1.03;
 gaincor2[17] = 1.02;



for (int j = 1; j<=2; j++){ 
for( int i = 0; i <= 17; i++ ){

  //// initialize some parameters
 k = 0;
 epsilon = 0.01;  // step size for each iteration
 fitpar[2] = 1.0;
 if (j==1){lastsmall = gaincor[i];}
 if (j==2){lastsmall = gaincor2[i];}

 if (gaincor[i]<1.0){epsilon=-0.01;} //should go faster if you start in the same direction as last time
 if (gaincor2[i]<1.0){epsilon=-0.01;}


 //// START of fitting loop
 do {
    k += 1;
  fitpar[5] = fitpar[2]; 
 
  //// define histograms
  TH1F *hist = new TH1F( "hist","z", 400,-1.5,1.5);
  TH1F *hist2 = new TH1F( "hist2","Ephoton/GeomMean", 200,0.0,0.4);

  //// put together the argument to Draw
  sprintf( S1, "adcS.s1*%f",gaincor[0]);strcat(drawthis,S1);
  sprintf( S2, "+adcS.s2*%f",gaincor[1]);strcat(drawthis,S2);
  sprintf( S3, "+adcS.s3*%f",gaincor[2]);strcat(drawthis,S3);
  sprintf( S4, "+adcS.s4*%f",gaincor[3]);strcat(drawthis,S4);
  sprintf( S5, "+adcS.s5*%f",gaincor[4]);strcat(drawthis,S5);
  sprintf( S6, "+adcS.s6*%f",gaincor[5]);strcat(drawthis,S6);
  sprintf( S7, "+adcS.s7*%f",gaincor[6]);strcat(drawthis,S7);
  sprintf( S8, "+adcS.s8*%f",gaincor[7]);strcat(drawthis,S8);
  sprintf( S9, "+adcS.s9*%f",gaincor[8]);strcat(drawthis,S9);
  sprintf( S10, "+adcS.s10*%f",gaincor[9]);strcat(drawthis,S10);
  sprintf( S11, "+adcS.s11*%f",gaincor[10]);strcat(drawthis,S11);
  sprintf( S12, "+adcS.s12*%f",gaincor[11]);strcat(drawthis,S12);
  sprintf( S13, "+adcS.s13*%f",gaincor[12]);strcat(drawthis,S13);
  sprintf( S14, "+adcS.s14*%f",gaincor[13]);strcat(drawthis,S14);
  sprintf( S15, "+adcS.s15*%f",gaincor[14]);strcat(drawthis,S15);
  sprintf( S16, "+adcS.s16*%f",gaincor[15]);strcat(drawthis,S16);
  sprintf( S17, "+adcS.s17*%f",gaincor[16]);strcat(drawthis,S17);
  sprintf( S18, "+adcS.s18*%f",gaincor[17]);strcat(drawthis,S18);
  sprintf( N1, "adcN.n1*%f",gaincor2[0]);strcat(drawthat,N1);
  sprintf( N2, "+adcN.n2*%f",gaincor2[1]);strcat(drawthat,N2);
  sprintf( N3, "+adcN.n3*%f",gaincor2[2]);strcat(drawthat,N3);
  sprintf( N4, "+adcN.n4*%f",gaincor2[3]);strcat(drawthat,N4);
  sprintf( N5, "+adcN.n5*%f",gaincor2[4]);strcat(drawthat,N5);
  sprintf( N6, "+adcN.n6*%f",gaincor2[5]);strcat(drawthat,N6);
  sprintf( N7, "+adcN.n7*%f",gaincor2[6]);strcat(drawthat,N7);
  sprintf( N8, "+adcN.n8*%f",gaincor2[7]);strcat(drawthat,N8);
  sprintf( N9, "+adcN.n9*%f",gaincor2[8]);strcat(drawthat,N9);
  sprintf( N10, "+adcN.n10*%f",gaincor2[9]);strcat(drawthat,N10);
  sprintf( N11, "+adcN.n11*%f",gaincor2[10]);strcat(drawthat,N11);
  sprintf( N12, "+adcN.n12*%f",gaincor2[11]);strcat(drawthat,N12);
  sprintf( N13, "+adcN.n13*%f",gaincor2[12]);strcat(drawthat,N13);
  sprintf( N14, "+adcN.n14*%f",gaincor2[13]);strcat(drawthat,N14);
  sprintf( N15, "+adcN.n15*%f",gaincor2[14]);strcat(drawthat,N15);
  sprintf( N16, "+adcN.n16*%f",gaincor2[15]);strcat(drawthat,N16);
  sprintf( N17, "+adcN.n17*%f",gaincor2[16]);strcat(drawthat,N17);
  sprintf( N18, "+adcN.n18*%f",gaincor2[17]);strcat(drawthat,N18);
  strcat(drawthis,")*(");
  strcat(drawthis,drawthat);

  strcat(adccalib,drawthis);
  strcat(adccalib,")))>>hist2");
  //  cout << adccalib << "xxxx" << endl;
  
  //// cuts
  sprintf(cut1 , "trig\=\=8\&\&Nphotons\=\=1\&\&Ephoton\>200\.0\&\&Ephoton\<400\.0\&\&Ntdctrig\>\=8%s",""); 
 
  
  //// draw and find the mean for E_photon / E_bcal(geometric mean)
  bcal->Draw(adccalib,cut1);
  adcmeann[1] = hist2->GetMean();
  adcrmsN[1] = hist2->GetRMS();
  g2 = new TF1("g2","gaus",(adcmeann[1]-adcrmsN[1]),(adcmeann[1]+adcrmsN[1]));
  hist2->Fit("g2","R");
  fitpar[7] = g2->GetParameter(1);


  //// add the mean to the "z" Draw arguement 
  sprintf(adccalib2, "))*%f",fitpar[7]);
  strcat(drawthis,adccalib2);
  strcat(drawthis,"-Ephoton)/Ephoton>>hist");
  // cout << drawthis << "xxxx" << endl;
  
 
  //// Draw and find the parameters for z for this iteration 
  bcal->Draw(drawthis,cut1); 
  adcmeann[0] = hist->GetMean();
  adcrmsN[0] = hist->GetRMS();
  g1 = new TF1("g1","gaus",(-adcrmsN[0]),(+adcrmsN[0]));
  hist->Fit("g1","R");
  fitpar[0] = g1->GetParameter(0);  //contant
  fitpar[1] = g1->GetParameter(1);  //mean
  fitpar[2] = g1->GetParameter(2);  //sigma
  chisqr[0] = g1->GetChisquare();   //Chi squared
  fitndf[0] = g1->GetNDF();         //degrees of freedom


  //// delete histograms and reset Draw arguement char array
  hist->Delete();
  hist2->Delete();
  strcpy(drawthis, "(sqrt((");
  strcpy(drawthat, " ");
  strcpy(adccalib, "Ephoton/");

  //// output paramters on the go
  cout << "i="<< i <<" "<< fitpar[0] << " " << fitpar[1] << " "<< fitpar[2] << " "<< chisqr[0] << "\/" << fitndf[0] << " " << k << " " << gaincor[i] <<" "<< gaincor2[i] << endl;

  ////  determine if the new sigma is larger than the old one, then decide what to do 
  /// North gaincor 
  if (j==1) {
  if (epsilon >0) {
    if (fitpar[2] > fitpar[5]) {
      if (k == 2) { 
	fitpar[5] = fitpar[2]; //dummy step so it does't exit
      epsilon = -epsilon;
      gaincor[i] += epsilon;
      } // if after the first iteration sigma is larger, go the other direction
    }
    if (fitpar[2] < fitpar[5]) {  
      lastsmall = gaincor[i];
      gaincor[i] += epsilon;}
    }// if the sigma is smaller on this iteration keep going
  if (epsilon < 0) {
    if (fitpar[2] > fitpar[5]) {
      if (k == 2) { 
	fitpar[5] = fitpar[2]; //dummy step so it doesn't exit
      epsilon = -epsilon;
      gaincor[i] += epsilon;
      }// if after the first iteration sigma is larger, go the other direction 
    }


  if (fitpar[2] < fitpar[5]) {
    lastsmall = gaincor[i];
    gaincor[i] += epsilon;}
  }
  if (fitpar[2] > fitpar[5] && k>2) {gaincor[i] = lastsmall;}  //use the last gaincor[i] that gave the smallest sigma, go to next PMT
  }
 
  // South gaincor
  if (j==2) {
  if (epsilon >0) {
    if (fitpar[2] > fitpar[5]) {
      if (k == 2) { 
	fitpar[5] = fitpar[2]; //dummy step so it doesn't exit
      epsilon = -epsilon;
      gaincor2[i] += epsilon;
      }// if after the first iteration sigma is larger, go the other direction 
    }
    if (fitpar[2] < fitpar[5]) {  
      lastsmall = gaincor2[i];
      gaincor2[i] += epsilon;}
    }// if the sigma is smaller on this iteration keep going
  if (epsilon < 0) {
    if (fitpar[2] > fitpar[5]) {
      if (k == 2) { 
	fitpar[5] = fitpar[2]; //dummy step so it doesn't exit
      epsilon = -epsilon;
      gaincor2[i] += epsilon;
      }// if after the first iteration sigma is larger, go the other direction 
    }


  if (fitpar[2] < fitpar[5]) {
    lastsmall = gaincor2[i];
    gaincor2[i] += epsilon;}
  }
  if (fitpar[2] > fitpar[5] && k>2) {gaincor2[i] = lastsmall;}
  }
  


 }
  while (fitpar[2] <= fitpar[5]);  //end the loop for this photomultiplier tube
  



}
}





for ( int l = 0;l<=17;l++){
  outputfile << fitpar[0] << " " << fitpar[1] << " "<< fitpar[2] << " "<< chisqr[0] << "\/" << fitndf[0] <<  " " << gaincor[l] <<" "<<gaincor2[l] <<  endl;
  // outputs the current gain correction factors to "peakfit.txt". Final ones are at the end of the file.
}
}