ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

// d/p ratio
// author: Eulogio Serradilla <eulogio.serradilla@cern.ch>

#if !defined(__CINT__) || defined(__MAKECINT__)
#include <Riostream.h>
#include <TROOT.h>
#include <TFile.h>
#include <TString.h>
#include <TGraphErrors.h>
#include <TF1.h>
#include <TCanvas.h>
#include <TMath.h>
#include <TStyle.h>
#include <TFitResult.h>
#include <TFitResultPtr.h>
#include <TVirtualFitter.h>
#include <TPaveText.h>
#include <TAxis.h>
#endif

#include "B2.h"
#include "Config.h"

void GetRatio(Double_t x, Double_t y, Double_t errx, Double_t erry, Double_t& r, Double_t& rerr);
void Draw(TGraph* gr, Int_t marker, Int_t color, const TString& xtitle, const TString& ytitle);

void RatioMult(  const TString&  pSpectra   = "~/alice/output/Proton-lhc10d-Mult-Spectra.root"
               , const TString&  dSpectra   = "~/alice/output/Deuteron-lhc10d-hilow-Mult-Spectra.root"
               , const TString&  ptag       = "lhc10d"
               , const TString&  dtag       = "lhc10d"
               , const Int_t     nx         = B2Mult::kNmult
               , const TString*  xtag       = B2Mult::kMultTag
               , const Double_t* x          = B2Mult::kKNOmult
               , const Double_t* xerr       = B2Mult::kKNOmultErr
               , const TString&  xname      = B2Mult::kKNOmultName
               , const Bool_t    qTsallis   = 0
               , const TString&  outputfile = "~/alice/output/Particle-Ratios-lhc10d-Tsallis.root"
               , const TString&  otag       = "Tsallis")
{

//
// d/p ratio as a function of X
//
	const Int_t kNspec = 2;
	const Int_t kNpart = 2;
	
	const TString kParticle[kNspec][kNpart] = { {"Proton", "AntiProton"}, { "Deuteron", "AntiDeuteron"} };
	
	const Double_t xmin[kNspec] = {0., 0.};
	const Double_t xmax[kNspec] = {100, 100};
	
	const Double_t xminf[kNspec] = {0.4, 0.8};
	const Double_t xmaxf[kNspec] = {2., 2.2};
	
	TVirtualFitter::SetDefaultFitter("Minuit2");
	
	TFile* fproton = new TFile(pSpectra.Data(), "read");
	if(fproton->IsZombie()) exit(1);
	
	TFile* fdeuteron = new TFile(dSpectra.Data(), "read");
	if(fdeuteron->IsZombie()) exit(1);
	
	TFile* finput[kNspec] = { fproton, fdeuteron };
	TString tag[kNspec] = { ptag, dtag };
	
	// particle ratios
	TGraphErrors* grRatio[kNspec]           = { new TGraphErrors(), new TGraphErrors() };
	TGraphErrors* grMixRatio[kNspec]        = { new TGraphErrors(), new TGraphErrors() };
	
	// model parameters
	TGraphErrors* grP0[kNspec][kNpart]      = {{new TGraphErrors(), new TGraphErrors()},
	                                           {new TGraphErrors(), new TGraphErrors()}};
	TGraphErrors* grP1[kNspec][kNpart]      = {{new TGraphErrors(), new TGraphErrors()},
	                                           {new TGraphErrors(), new TGraphErrors()}};
	TGraphErrors* grP2[kNspec][kNpart]      = {{new TGraphErrors(), new TGraphErrors()},
	                                           {new TGraphErrors(), new TGraphErrors()}};
	
	TGraphErrors* grdNdy[kNspec][kNpart]    = {{new TGraphErrors(), new TGraphErrors()},
	                                           {new TGraphErrors(), new TGraphErrors()}};
	
	TGraphErrors* grMeanPt[kNspec][kNpart]  = {{new TGraphErrors(), new TGraphErrors()},
	                                           {new TGraphErrors(), new TGraphErrors()}};
	
	using std::cout;
	using std::endl;
	
	TGraphErrors* grDYieldPt[nx][kNspec][kNpart];
	TF1* fncTsallis[nx][kNspec][kNpart];
	
	for(Int_t i=0; i<nx; ++i)
	{
		Double_t dNdy[kNspec][kNpart];
		Double_t dNdyErr[kNspec][kNpart];
		
		cout << endl << xtag[i] << endl << endl;
		
		for(Int_t j=0; j<kNspec; ++j)
		{
			for(Int_t k=0; k<kNpart; ++k)
			{
				// data
				
				grDYieldPt[i][j][k] = FindObj<TGraphErrors>(finput[j], tag[j] + xtag[i], kParticle[j][k] + "_StatSystErr_DiffYield_Pt");
				
				// Tsallis distribution
				
				fncTsallis[i][j][k] = (qTsallis) ? QTsallisDYield(GetMass(kParticle[j][k]), kParticle[j][k] + "_Tsallis_DiffYield_Pt",xmin[j],xmax[j])
				                                 : TsallisDYield(GetMass(kParticle[j][k]), kParticle[j][k] + "_Tsallis_DiffYield_Pt",xmin[j],xmax[j]);
				
				// fit to data
				
				TFitResultPtr r = grDYieldPt[i][j][k]->Fit(fncTsallis[i][j][k], "RENSQ");
				Int_t status = r;
				
				Int_t n=0;
				while(status != 0 && n<7)
				{
					r = grDYieldPt[i][j][k]->Fit(fncTsallis[i][j][k], "RENSQ");
					status = r;
					++n;
					printf("\t*** %s, status: %d (%d)\n", kParticle[j][k].Data(), status,n);
				}
				
				// integral
				
				Double_t integral = fncTsallis[i][j][k]->Integral(xmin[j], xmax[j]);
				Double_t intErr   = fncTsallis[i][j][k]->IntegralError(xmin[j], xmax[j], r->GetParams(),  r->GetCovarianceMatrix().GetMatrixArray());
				
				// mean pt (dy cancels out)
				
				TF1* fncPtTsallis = (qTsallis) ? PtQTsallisDYield(GetMass(kParticle[j][k]), kParticle[j][k] + "_Tsallis_MeanPt",xmin[j],xmax[j])
				                            : PtTsallisDYield(GetMass(kParticle[j][k]), kParticle[j][k] + "_Tsallis_MeanPt",xmin[j],xmax[j]) ;
				
				Double_t par[]   = {  fncTsallis[i][j][k]->GetParameter(0)
				                    , fncTsallis[i][j][k]->GetParameter(1)
					            , fncTsallis[i][j][k]->GetParameter(2)
					           };
					
				Double_t parErr[] = {  fncTsallis[i][j][k]->GetParError(0)
					             , fncTsallis[i][j][k]->GetParError(1)
					             , fncTsallis[i][j][k]->GetParError(2)
					            };
				
				fncPtTsallis->SetParameters(par);
				fncPtTsallis->SetParErrors(parErr);
				
				Double_t intPtTsallis    = fncPtTsallis->Integral(xmin[j], xmax[j]);
				Double_t intPtTsallisErr = fncPtTsallis->IntegralError(xmin[j], xmax[j], r->GetParams(), r->GetCovarianceMatrix().GetMatrixArray());
				
				Double_t meanPt, meanPtErr;
				GetRatio(intPtTsallis, integral, intPtTsallisErr, intErr, meanPt, meanPtErr);
				
				grMeanPt[j][k]->SetPoint(i, x[i], meanPt);
				grMeanPt[j][k]->SetPointError(i, xerr[i], meanPtErr);
				
				delete fncPtTsallis;
				
				// extrapolation fraction
				
				Double_t intFrac    = fncTsallis[i][j][k]->Integral(xminf[j], xmaxf[j]);
				Double_t intFracErr = fncTsallis[i][j][k]->IntegralError(xminf[j], xmaxf[j], r->GetParams(), r->GetCovarianceMatrix().GetMatrixArray());
				
				Double_t extrFrac, extrFracErr;
				GetRatio(intFrac, integral, intFracErr, intErr, extrFrac, extrFracErr);
				
				// dN/dy
				
				dNdy[j][k]    = (qTsallis) ? fncTsallis[i][j][k]->GetParameter(0) : integral;
				dNdyErr[j][k] = (qTsallis) ? fncTsallis[i][j][k]->GetParError(0)  : intErr;
				
				grdNdy[j][k]->SetPoint(i, x[i], dNdy[j][k]);
				grdNdy[j][k]->SetPointError(i, xerr[i], dNdyErr[j][k]);
				
				// debug
				printf("\t*** %s, status: %d\tdN/dy: %g +/- %g\t extr: %g +/- %g\t<pt>: %g +/- %g\n", kParticle[j][k].Data(), status, dNdy[j][k], dNdyErr[j][k], 1.-extrFrac, extrFracErr, meanPt, meanPtErr);
			}
		}
		
		// ratios
		Double_t ratio[kNspec], ratioErr[kNspec];
		for(Int_t j=0; j<kNspec; ++j)
		{
			GetRatio(dNdy[j][1], dNdy[j][0], dNdyErr[j][1], dNdyErr[j][0], ratio[j], ratioErr[j]);
			
			grRatio[j]->SetPoint(i, x[i], ratio[j]);
			grRatio[j]->SetPointError(i, 0, ratioErr[j]);
		}
		
		// mixed ratios
		Double_t mixRatio[kNpart], mixRatioErr[kNpart];
		for(Int_t j=0; j<kNpart; ++j)
		{
			GetRatio(dNdy[1][j], dNdy[0][j], dNdyErr[1][j], dNdyErr[0][j], mixRatio[j], mixRatioErr[j]);
			
			grMixRatio[j]->SetPoint(i, x[i], mixRatio[j]);
			grMixRatio[j]->SetPointError(i, xerr[i], mixRatioErr[j]);
		}
		
		// model parameters
		for(Int_t j=0; j<kNspec; ++j)
		{
			for(Int_t k=0; k<kNpart; ++k)
			{
				grP0[j][k]->SetPoint(i, x[i], fncTsallis[i][j][k]->GetParameter(0));
				grP0[j][k]->SetPointError(i, xerr[i], fncTsallis[i][j][k]->GetParError(0));
				
				grP1[j][k]->SetPoint(i, x[i], fncTsallis[i][j][k]->GetParameter(1));
				grP1[j][k]->SetPointError(i, xerr[i], fncTsallis[i][j][k]->GetParError(1));
				
				grP2[j][k]->SetPoint(i, x[i], fncTsallis[i][j][k]->GetParameter(2));
				grP2[j][k]->SetPointError(i, xerr[i], fncTsallis[i][j][k]->GetParError(2));
			}
		}
	}
	
	// save
	
	TFile* foutput = new TFile(outputfile.Data(), "recreate");
	if (foutput->IsZombie()) exit(1);
	
	foutput->mkdir(otag.Data());
	foutput->cd(otag.Data());
	
	for(Int_t i=0; i<kNspec; ++i)
	{
		grRatio[i]->SetName(Form("%s%s_Ratio", kParticle[i][1].Data(), kParticle[i][0].Data()));
		grRatio[i]->Write();
		
		grMixRatio[i]->SetName(Form("%s%s_Ratio", kParticle[1][i].Data(), kParticle[0][i].Data()));
		grMixRatio[i]->Write();
	}
	
	for(Int_t i=0; i<kNspec; ++i)
	{
		for(Int_t j=0; j<kNpart; ++j)
		{
			grP0[i][j]->SetName(Form("%s_P0", kParticle[i][j].Data()));
			grP1[i][j]->SetName(Form("%s_P1", kParticle[i][j].Data()));
			grP2[i][j]->SetName(Form("%s_P2", kParticle[i][j].Data()));
			
			grP0[i][j]->Write();
			grP1[i][j]->Write();
			grP2[i][j]->Write();
			
			grdNdy[i][j]->SetName(Form("%s_dNdy", kParticle[i][j].Data()));
			grdNdy[i][j]->Write();
			
			grMeanPt[i][j]->SetName(Form("%s_MeanPt", kParticle[i][j].Data()));
			grMeanPt[i][j]->Write();
		}
	}
	
	// draw
	
	gStyle->SetPadTickX(1);
	gStyle->SetPadTickY(1);
	gStyle->SetOptStat(0);
	
	const Int_t kNCol = 3;
	
	TCanvas* c0[kNspec];
	
	for(Int_t i=0; i<kNspec; ++i)
	{
		c0[i] = new TCanvas(Form("c0.%s",kParticle[i][0].Data()), Form("%s model parameters",kParticle[i][0].Data()));
		c0[i]->Divide(kNCol,2);
		
		for(Int_t j=0; j<kNpart; ++j)
		{
			c0[i]->cd(kNCol*j+1);
			Draw(grP0[i][j], kFullCircle, kBlue, xname, fncTsallis[0][0][0]->GetParName(0));
			
			c0[i]->cd(kNCol*j+2);
			Draw(grP1[i][j], kFullCircle, kBlue, xname, fncTsallis[0][0][0]->GetParName(1));
			
			c0[i]->cd(kNCol*j+3);
			Draw(grP2[i][j], kFullCircle, kBlue, xname, fncTsallis[0][0][0]->GetParName(2));
		}
	}
	
	TCanvas* c1 = new TCanvas("c1", "Particle ratios");
	c1->Divide(2,2);
	
	c1->cd(1);
	Draw(grRatio[0], kFullCircle, kRed, xname, "#bar{p}/p");
	
	c1->cd(2);
	Draw(grRatio[1], kFullCircle, kRed, xname, "#bar{d}/d");
	
	c1->cd(3);
	Draw(grMixRatio[0], kFullCircle, kRed, xname, "d/p");
	
	c1->cd(4);
	Draw(grMixRatio[1], kFullCircle, kRed, xname, "#bar{d}/#bar{p}");
	
	// spectra
	
	TPaveText* label[nx][kNspec][kNpart];
	
	TCanvas* c2[kNspec][kNpart];
	
	for(Int_t j=0; j<kNspec; ++j)
	{
		for(Int_t k=0; k<kNpart; ++k)
		{
			c2[j][k] = new TCanvas(Form("c2.%s",kParticle[j][k].Data()), Form("%s data",kParticle[j][k].Data()));
			c2[j][k]->Divide(3,2);
			for(Int_t i=0; i<nx && i<6; ++i)
			{
				gPad->SetLogy(0);
				c2[j][k]->cd(i+1);
				Draw(grDYieldPt[i][j][k], kFullCircle, kBlue, "p_{T} (GeV/c)", "1/N_{ev} d^{2}N/dp_{T}dy (GeV^{-1})");
				fncTsallis[i][j][k]->SetLineWidth(1);
				fncTsallis[i][j][k]->Draw("same");
				
				label[i][j][k] = new TPaveText(0.5658525,0.7471751,0.814296,0.835452,"brNDC");
				label[i][j][k]->AddText(Form("%s = %.2f",xname.Data(),x[i]));
				label[i][j][k]->SetBorderSize(0);
				label[i][j][k]->SetFillColor(0);
				label[i][j][k]->SetTextSize(0.06);
				label[i][j][k]->Draw();
			}
		}
	}
	
	delete foutput;
	delete fproton;
	delete fdeuteron;
	
	// free memory
}

void GetRatio(Double_t x, Double_t y, Double_t errx, Double_t erry, Double_t& r, Double_t& rerr)
{
//
// get the ratio of x/y, its error and save in r and rerr
//
	if(x == 0 || y == 0)
	{
		r=0;
		rerr=1e+16;
		
		return;
	}
	
	r = x/y;
	rerr = r*TMath::Sqrt(TMath::Power(errx/x,2)+TMath::Power(erry/y,2));
}

void Draw(TGraph* gr, Int_t marker, Int_t color, const TString& xtitle, const TString& ytitle)
{
//
// draw a graph in current canvas
//
	gr->SetMarkerStyle(marker);
	gr->SetMarkerColor(color);
	gr->SetLineColor(color);
	gr->GetXaxis()->SetTitle(xtitle.Data());
	gr->GetYaxis()->SetTitle(ytitle.Data());
	gr->GetYaxis()->SetTitleOffset(1.3);
	gr->Draw("zAP");
}
 RatioMult.C:1
 RatioMult.C:2
 RatioMult.C:3
 RatioMult.C:4
 RatioMult.C:5
 RatioMult.C:6
 RatioMult.C:7
 RatioMult.C:8
 RatioMult.C:9
 RatioMult.C:10
 RatioMult.C:11
 RatioMult.C:12
 RatioMult.C:13
 RatioMult.C:14
 RatioMult.C:15
 RatioMult.C:16
 RatioMult.C:17
 RatioMult.C:18
 RatioMult.C:19
 RatioMult.C:20
 RatioMult.C:21
 RatioMult.C:22
 RatioMult.C:23
 RatioMult.C:24
 RatioMult.C:25
 RatioMult.C:26
 RatioMult.C:27
 RatioMult.C:28
 RatioMult.C:29
 RatioMult.C:30
 RatioMult.C:31
 RatioMult.C:32
 RatioMult.C:33
 RatioMult.C:34
 RatioMult.C:35
 RatioMult.C:36
 RatioMult.C:37
 RatioMult.C:38
 RatioMult.C:39
 RatioMult.C:40
 RatioMult.C:41
 RatioMult.C:42
 RatioMult.C:43
 RatioMult.C:44
 RatioMult.C:45
 RatioMult.C:46
 RatioMult.C:47
 RatioMult.C:48
 RatioMult.C:49
 RatioMult.C:50
 RatioMult.C:51
 RatioMult.C:52
 RatioMult.C:53
 RatioMult.C:54
 RatioMult.C:55
 RatioMult.C:56
 RatioMult.C:57
 RatioMult.C:58
 RatioMult.C:59
 RatioMult.C:60
 RatioMult.C:61
 RatioMult.C:62
 RatioMult.C:63
 RatioMult.C:64
 RatioMult.C:65
 RatioMult.C:66
 RatioMult.C:67
 RatioMult.C:68
 RatioMult.C:69
 RatioMult.C:70
 RatioMult.C:71
 RatioMult.C:72
 RatioMult.C:73
 RatioMult.C:74
 RatioMult.C:75
 RatioMult.C:76
 RatioMult.C:77
 RatioMult.C:78
 RatioMult.C:79
 RatioMult.C:80
 RatioMult.C:81
 RatioMult.C:82
 RatioMult.C:83
 RatioMult.C:84
 RatioMult.C:85
 RatioMult.C:86
 RatioMult.C:87
 RatioMult.C:88
 RatioMult.C:89
 RatioMult.C:90
 RatioMult.C:91
 RatioMult.C:92
 RatioMult.C:93
 RatioMult.C:94
 RatioMult.C:95
 RatioMult.C:96
 RatioMult.C:97
 RatioMult.C:98
 RatioMult.C:99
 RatioMult.C:100
 RatioMult.C:101
 RatioMult.C:102
 RatioMult.C:103
 RatioMult.C:104
 RatioMult.C:105
 RatioMult.C:106
 RatioMult.C:107
 RatioMult.C:108
 RatioMult.C:109
 RatioMult.C:110
 RatioMult.C:111
 RatioMult.C:112
 RatioMult.C:113
 RatioMult.C:114
 RatioMult.C:115
 RatioMult.C:116
 RatioMult.C:117
 RatioMult.C:118
 RatioMult.C:119
 RatioMult.C:120
 RatioMult.C:121
 RatioMult.C:122
 RatioMult.C:123
 RatioMult.C:124
 RatioMult.C:125
 RatioMult.C:126
 RatioMult.C:127
 RatioMult.C:128
 RatioMult.C:129
 RatioMult.C:130
 RatioMult.C:131
 RatioMult.C:132
 RatioMult.C:133
 RatioMult.C:134
 RatioMult.C:135
 RatioMult.C:136
 RatioMult.C:137
 RatioMult.C:138
 RatioMult.C:139
 RatioMult.C:140
 RatioMult.C:141
 RatioMult.C:142
 RatioMult.C:143
 RatioMult.C:144
 RatioMult.C:145
 RatioMult.C:146
 RatioMult.C:147
 RatioMult.C:148
 RatioMult.C:149
 RatioMult.C:150
 RatioMult.C:151
 RatioMult.C:152
 RatioMult.C:153
 RatioMult.C:154
 RatioMult.C:155
 RatioMult.C:156
 RatioMult.C:157
 RatioMult.C:158
 RatioMult.C:159
 RatioMult.C:160
 RatioMult.C:161
 RatioMult.C:162
 RatioMult.C:163
 RatioMult.C:164
 RatioMult.C:165
 RatioMult.C:166
 RatioMult.C:167
 RatioMult.C:168
 RatioMult.C:169
 RatioMult.C:170
 RatioMult.C:171
 RatioMult.C:172
 RatioMult.C:173
 RatioMult.C:174
 RatioMult.C:175
 RatioMult.C:176
 RatioMult.C:177
 RatioMult.C:178
 RatioMult.C:179
 RatioMult.C:180
 RatioMult.C:181
 RatioMult.C:182
 RatioMult.C:183
 RatioMult.C:184
 RatioMult.C:185
 RatioMult.C:186
 RatioMult.C:187
 RatioMult.C:188
 RatioMult.C:189
 RatioMult.C:190
 RatioMult.C:191
 RatioMult.C:192
 RatioMult.C:193
 RatioMult.C:194
 RatioMult.C:195
 RatioMult.C:196
 RatioMult.C:197
 RatioMult.C:198
 RatioMult.C:199
 RatioMult.C:200
 RatioMult.C:201
 RatioMult.C:202
 RatioMult.C:203
 RatioMult.C:204
 RatioMult.C:205
 RatioMult.C:206
 RatioMult.C:207
 RatioMult.C:208
 RatioMult.C:209
 RatioMult.C:210
 RatioMult.C:211
 RatioMult.C:212
 RatioMult.C:213
 RatioMult.C:214
 RatioMult.C:215
 RatioMult.C:216
 RatioMult.C:217
 RatioMult.C:218
 RatioMult.C:219
 RatioMult.C:220
 RatioMult.C:221
 RatioMult.C:222
 RatioMult.C:223
 RatioMult.C:224
 RatioMult.C:225
 RatioMult.C:226
 RatioMult.C:227
 RatioMult.C:228
 RatioMult.C:229
 RatioMult.C:230
 RatioMult.C:231
 RatioMult.C:232
 RatioMult.C:233
 RatioMult.C:234
 RatioMult.C:235
 RatioMult.C:236
 RatioMult.C:237
 RatioMult.C:238
 RatioMult.C:239
 RatioMult.C:240
 RatioMult.C:241
 RatioMult.C:242
 RatioMult.C:243
 RatioMult.C:244
 RatioMult.C:245
 RatioMult.C:246
 RatioMult.C:247
 RatioMult.C:248
 RatioMult.C:249
 RatioMult.C:250
 RatioMult.C:251
 RatioMult.C:252
 RatioMult.C:253
 RatioMult.C:254
 RatioMult.C:255
 RatioMult.C:256
 RatioMult.C:257
 RatioMult.C:258
 RatioMult.C:259
 RatioMult.C:260
 RatioMult.C:261
 RatioMult.C:262
 RatioMult.C:263
 RatioMult.C:264
 RatioMult.C:265
 RatioMult.C:266
 RatioMult.C:267
 RatioMult.C:268
 RatioMult.C:269
 RatioMult.C:270
 RatioMult.C:271
 RatioMult.C:272
 RatioMult.C:273
 RatioMult.C:274
 RatioMult.C:275
 RatioMult.C:276
 RatioMult.C:277
 RatioMult.C:278
 RatioMult.C:279
 RatioMult.C:280
 RatioMult.C:281
 RatioMult.C:282
 RatioMult.C:283
 RatioMult.C:284
 RatioMult.C:285
 RatioMult.C:286
 RatioMult.C:287
 RatioMult.C:288
 RatioMult.C:289
 RatioMult.C:290
 RatioMult.C:291
 RatioMult.C:292
 RatioMult.C:293
 RatioMult.C:294
 RatioMult.C:295
 RatioMult.C:296
 RatioMult.C:297
 RatioMult.C:298
 RatioMult.C:299
 RatioMult.C:300
 RatioMult.C:301
 RatioMult.C:302
 RatioMult.C:303
 RatioMult.C:304
 RatioMult.C:305
 RatioMult.C:306
 RatioMult.C:307
 RatioMult.C:308
 RatioMult.C:309
 RatioMult.C:310
 RatioMult.C:311
 RatioMult.C:312
 RatioMult.C:313
 RatioMult.C:314
 RatioMult.C:315
 RatioMult.C:316
 RatioMult.C:317
 RatioMult.C:318
 RatioMult.C:319
 RatioMult.C:320
 RatioMult.C:321
 RatioMult.C:322
 RatioMult.C:323
 RatioMult.C:324
 RatioMult.C:325
 RatioMult.C:326
 RatioMult.C:327
 RatioMult.C:328
 RatioMult.C:329
 RatioMult.C:330
 RatioMult.C:331
 RatioMult.C:332
 RatioMult.C:333
 RatioMult.C:334
 RatioMult.C:335
 RatioMult.C:336
 RatioMult.C:337
 RatioMult.C:338
 RatioMult.C:339
 RatioMult.C:340
 RatioMult.C:341
 RatioMult.C:342
 RatioMult.C:343
 RatioMult.C:344
 RatioMult.C:345
 RatioMult.C:346
 RatioMult.C:347
 RatioMult.C:348
 RatioMult.C:349
 RatioMult.C:350
 RatioMult.C:351
 RatioMult.C:352
 RatioMult.C:353
 RatioMult.C:354
 RatioMult.C:355
 RatioMult.C:356
 RatioMult.C:357
 RatioMult.C:358
 RatioMult.C:359
 RatioMult.C:360
 RatioMult.C:361
 RatioMult.C:362
 RatioMult.C:363
 RatioMult.C:364
 RatioMult.C:365
 RatioMult.C:366
 RatioMult.C:367
 RatioMult.C:368
 RatioMult.C:369
 RatioMult.C:370
 RatioMult.C:371
 RatioMult.C:372
 RatioMult.C:373
 RatioMult.C:374
 RatioMult.C:375
 RatioMult.C:376
 RatioMult.C:377
 RatioMult.C:378