/* $Id: CbmEcalSCurveLibRecord.cxx,v 1.1 2006/09/18 07:58:04 prokudin Exp $ */ /* * $Log: CbmEcalSCurveLibRecord.cxx,v $ * Revision 1.1 2006/09/18 07:58:04 prokudin * First implementation of SCurve library * */ #include "CbmEcalSCurveLibRecord.h" #include "TFile.h" #include "TTree.h" #include #include #include using std::cerr; using std::endl; using std::list; // - implementation CbmEcalSCurveLibRecord::CbmEcalSCurveLibRecord(const char* filename) : fCellSize(0), fPoints(0), fEnergies(0), fE(NULL), fThetas(NULL), fTheta(NULL), fA(NULL), fX(NULL), fSize(0), fTail(10), fXL(NULL), fDXL(NULL), fXR(NULL), fDXR(NULL) { TFile* file; TTree* tree; Float_t e; Float_t theta; Int_t size; Float_t* x; Float_t cellsize; list::const_iterator p; list es; list thetas; Int_t i; Int_t j; Int_t num; file=new TFile(filename); if (file->IsZombie()) { cerr << "Something wrong with input file " << filename << endl; return; } tree=(TTree*)file->Get("sc"); if (tree==NULL) { cerr << "Can't find SCurve tree in " << filename << endl; return; } if (tree->GetEntries()<1) { file->Close(); return; } tree->SetBranchAddress("outcellsize",&cellsize); tree->SetBranchAddress("oute",&e); tree->SetBranchAddress("outtheta",&theta); tree->SetBranchAddress("outsize",&size); tree->GetEntry(0); fCellSize=cellsize; fPoints=tree->GetEntries(); fSize=size; x=new Float_t[size]; es.clear(); thetas.clear(); for(i=0;iGetEntry(i); if (find(es.begin(), es.end(), e)==es.end()) es.push_back(e); if (find(thetas.begin(), thetas.end(), theta)==thetas.end()) thetas.push_back(theta); } //Initializing energies and thetas lists fE=new Float_t[es.size()]; fEnergies=0; for(p=es.begin();p!=es.end();p++) fE[fEnergies++]=(*p); fThetas=0; fTheta=new Float_t[thetas.size()]; for(p=thetas.begin();p!=thetas.end();p++) fTheta[fThetas++]=(*p); tree->SetBranchAddress("outx",x); fX=new Float_t*[fPoints]; for(i=0;iGetEntry(i); num=GetNum(e, theta); if (fX[num]!=NULL) { cerr << "Duplicate entry for " << e << "GeV, theta "; cerr << theta << ". Skipping!" << endl; continue; } fX[num]=new Float_t[fSize]; for(j=0;jClose(); delete file; InitA(); } void CbmEcalSCurveLibRecord::InitA() { Int_t i; Int_t j; Float_t step=1.0/(fSize-1); fA=new Float_t[fSize]; fA[0]=-0.5; for(i=1;itheta) break; if (i==fThetas) { if ((fTheta[fThetas-1]-theta)/theta>0.02) return -1111; tp=i-1; tn=i; } else { tp=i-1; tn=i; } tpf=(fTheta[tn]-theta)/(fTheta[tn]-fTheta[tp]); tnf=(theta-fTheta[tp])/(fTheta[tn]-fTheta[tp]); for(i=1;ie) break; if (i==fEnergies) { ep=i-1; en=i-1; epf=1.0; enf=0.0;} else { ep=i-1; en=i; epf=(fE[en]-e)/(fE[en]-fE[ep]); enf=(e-fE[ep])/(fE[en]-fE[ep]); } if (TMath::Abs(a)<=0.5) { for(i=1;ia) break; xn=i; xp=i-1; xpf=(fX[ep*fThetas+tp][xp]*tpf+fX[ep*fThetas+tn][xp]*tnf)*epf+(fX[en*fThetas+tp][xp]*tpf+fX[en*fThetas+tn][xp]*tnf)*enf; xnf=(fX[ep*fThetas+tp][xn]*tpf+fX[ep*fThetas+tn][xn]*tnf)*epf+(fX[en*fThetas+tp][xn]*tpf+fX[en*fThetas+tn][xn]*tnf)*enf; return (xpf*(fA[xn]-a)+xnf*(a-fA[xp]))/(fA[xn]-fA[xp]); } if (a>0.5) { xpf=(fXR[ep*fThetas+tp]*tpf+fXR[ep*fThetas+tn]*tnf)*epf+(fXR[en*fThetas+tp]*tpf+fXR[en*fThetas+tn]*tnf)*enf; xnf=(fDXR[ep*fThetas+tp]*tpf+fDXR[ep*fThetas+tn]*tnf)*epf+(fDXR[en*fThetas+tp]*tpf+fDXR[en*fThetas+tn]*tnf)*enf; return xpf+xnf*a; } xpf=(fXL[ep*fThetas+tp]*tpf+fXL[ep*fThetas+tn]*tnf)*epf+(fXL[en*fThetas+tp]*tpf+fXL[en*fThetas+tn]*tnf)*enf; xnf=(fDXL[ep*fThetas+tp]*tpf+fDXL[ep*fThetas+tn]*tnf)*epf+(fDXL[en*fThetas+tp]*tpf+fDXL[en*fThetas+tn]*tnf)*enf; return xpf+xnf*a; } Int_t CbmEcalSCurveLibRecord::GetNum(Float_t energy, Float_t theta) const { Int_t i; Int_t en; Int_t the; for(i=0;i