/* g++ -Wall -std=c++0x -I. code/CalibrationTest.cc -o CalibrationTest.exe `root-config --libs --cflags` */ /* 0 = SCs 1 = SCs with perfect ADC 0 = All TCs 0 = True energy TCs 1 = All TCs with cell centring 2 = Threshold TCs 3 = Equal share (0 bits) 4 = Equal share if > 0 (4 bits) 5 = SuperTCs (2 bits) 10-17 = Fractions 1-8 bits/TC (5-26 bits) 18 = HGCROC-like implementation of fraction 1 bit 19 = HGCROC-like implementation of fraction 2 bits 20-25 = Compression 8-3 bits/TC, drop LSBs (16-32 bits) 30-35 = Compression 8-3 bits/TC, saturate (16-32 bits) 40 = Fractions 1 bit/TC + 4E/5M 41 = Fractions 2 bits/TC + 3E/3M 42 = Fractions 2 bits/TC + 4E/2M 43 = Fractions 2 bits/TC + 5E/1M Work to limits when compressing: SC 25 x 2^12 < 2^5 x 2^12 = 2^17 NTC lo = 4 x 25 x 2^12 = 25 x 2^14 < 2^5 x 2^15 = 2^19 NTC hi = 9 x 25 x 2^12 = 225 x 2^12 < 2^8 x 2^12 = 2^20 CTC = 4 x 225 x 2^12 = 225 x 2^14 < 2^8 x 2^14 = 2^22 DONE ! Do two TOT ranges properly DONE ! Fix Gaussian to integrate properly Make PU from other Gaussians plus model as density not per sensor cell Set up various positions lo/hi radius for both densities DONE! Change numbers of cells to work for both 2.2 and 3.3 cm sizes Make sure we catch equal edges of fractions i.e. 1/4, 1/2, etc. correctly. Connect up fSinTheta with fEta */ #include "Hack.hh" #include #include #include #include #include #include "TFile.h" #include "TF1.h" #include "TH1D.h" #include "TH1F.h" #include "TH2F.h" #include "TProfile.h" //#include "TMath.h" #include "TE1F.hh" #include "TH1A.hh" #include "Random.hh" #include "PackerFloat22.hh" #include "TFileHandler.hh" const unsigned kNumberOfRadii(24); double cutRadius(unsigned r) { assert(r(fHiDensity?0.5:0.05)) fPileupArray[ix][iy]=0.0; else fPileupArray[ix][iy]=0.5+Random::random().Exp(5.0); fEnergyArray[ix][iy]=0.0; } } } void increment(unsigned ix, unsigned iy, double e) { assert(ix=4) bins=(1<<(m-3))-1; for(unsigned jx(2*ix);jx<2*(ix+1);jx++) { for(unsigned jy(2*iy);jy<2*(iy+1);jy++) { if(!(jx==mx && jy==my)) { if(fNtcAdc[kNtcReal][jx][jy]==0) fraction=0; else fraction=(2*bins*fNtcAdc[kNtcReal][jx][jy]-1)/sum; assert(fraction=4 && fraction==0) fNtcAdc[a][jx][jy]=0; hDeltaE1[kNtcFractions+m]->Fill(sum,(double(fNtcAdc[kNtcFractions+m][jx][jy])-double(fNtcAdc[kNtcReal][jx][jy]))/sum); hDeltaE2[kNtcFractions+m]->Fill(sum,(double(fNtcAdc[kNtcFractions+m][jx][jy])-double(fNtcAdc[kNtcReal][jx][jy]))/sum); } } } } else if(m==8) { unsigned sum2=sum; //std::cout << "Calling 4E5M with data = " << (sum+1)/2 << std::endl; fPacker4E5M.pack((sum+1)/2); sum=2*fPacker4E5M.unpack(); // Fractions 1 bit/TC + 4E/5M unsigned bins(2); for(unsigned jx(2*ix);jx<2*(ix+1);jx++) { for(unsigned jy(2*iy);jy<2*(iy+1);jy++) { if(!(jx==mx && jy==my)) { if(fNtcAdc[kNtcReal][jx][jy]==0) fraction=0; else fraction=(2*bins*fNtcAdc[kNtcReal][jx][jy]-1)/sum2; assert(fraction100000) { std::cout << "a = " << a << ", E1 = " << fNtcAdc[kNtcReal][mx][my] << " ~ " << fNtcAdc[a][mx][my] << " = " << fNtcAdc[a][2*ix ][2*iy ] << ", E2 = " << fNtcAdc[kNtcReal][mx][ny] << " ~ " << fNtcAdc[a][mx][ny] << " = " << fNtcAdc[a][2*ix+1][2*iy ] << ", E3 = " << fNtcAdc[kNtcReal][nx][my] << " ~ " << fNtcAdc[a][nx][my] << " = " << fNtcAdc[a][2*ix ][2*iy+1] << ", E4 = " << fNtcAdc[kNtcReal][nx][ny] << " ~ " << fNtcAdc[a][nx][ny] << " = " << fNtcAdc[a][2*ix+1][2*iy+1] << ", sum = " << fNtcAdc[kNtcReal][2*ix ][2*iy ]+fNtcAdc[kNtcReal][2*ix+1][2*iy ]+fNtcAdc[kNtcReal][2*ix ][2*iy+1]+fNtcAdc[kNtcReal][2*ix+1][2*iy+1] << " ~ " << fNtcAdc[a][2*ix ][2*iy ]+fNtcAdc[a][2*ix+1][2*iy ]+fNtcAdc[a][2*ix ][2*iy+1]+fNtcAdc[a][2*ix+1][2*iy+1] << " ~ " << sum << std::endl; assert(false); } if(m<8) assert((fNtcAdc[kNtcReal][2*ix][2*iy]+fNtcAdc[kNtcReal][2*ix+1][2*iy]+fNtcAdc[kNtcReal][2*ix][2*iy+1]+fNtcAdc[kNtcReal][2*ix+1][2*iy+1])==sum); assert((fNtcAdc[a][2*ix][2*iy]+fNtcAdc[a][2*ix+1][2*iy]+fNtcAdc[a][2*ix][2*iy+1]+fNtcAdc[a][2*ix+1][2*iy+1])==sum); } void digitise(unsigned mxx) { unsigned sigma3(unsigned(3.0*fNoise*fMip+0.5)); //std::cout << "sigma3 = " << sigma3 << std::endl; unsigned halfMip(unsigned(0.5*fMip+0.5)); //std::cout << "halfMip = " << halfMip << std::endl; unsigned nGap(300); // Sensor cells for(unsigned ix(0);ix1000) fScAdc[kScReal][ix][iy]=1000+nGap; } else { // Do two-range 9-bit TOT fScAdc[kScReal][ix][iy]=(fScAdc[kScReal][ix][iy]+13)/25; if(fScAdc[kScReal][ix][iy]<0x200) { fScAdc[kScReal][ix][iy]*=25; } else { fScAdc[kScReal][ix][iy]=(fScAdc[kScReal][ix][iy]+2)/4; if(fScAdc[kScReal][ix][iy]>0x1ff) fScAdc[kScReal][ix][iy]=0x1ff; fScAdc[kScReal][ix][iy]*=100; //std::cout << "ix,iy = " << ix << ", " << iy << " ADC = " << fScAdc[kScReal][ix][iy] << std::endl; } } hScAdcConversion->Fill(fScAdc[kScPerfect][ix][iy],fScAdc[kScReal][ix][iy]); hScAdcDeltaConversion->Fill(fScAdc[kScPerfect][ix][iy],int(fScAdc[kScReal][ix][iy])-int(fScAdc[kScPerfect][ix][iy])); // Thresholds for(unsigned m(0);m0) nNtcTh++; sum+=fNtcAdc[kNtcReal][jx][jy]; if(eMax<=fNtcAdc[kNtcReal][jx][jy]) { eMax=fNtcAdc[kNtcReal][jx][jy]; mx=jx; my=jy; } } } unsigned nx((mx%2)==0?mx+1:mx-1); unsigned ny((my%2)==0?my+1:my-1); //std::cout << "Doing normal trigger cells " << mx << ", " << my << std::endl; fPacker4E3M.pack((sum+4)/8); fPacker4E5M.pack((sum+1)/2); unsigned iNtcTh(0); for(unsigned jx(ix);jx0) { fNtcAdc[kNtcThresholdEqualShare][jx][jy]=(2*fPacker4E5M.unpack()+iNtcTh)/nNtcTh; iNtcTh++; } else fNtcAdc[kNtcThresholdEqualShare][jx][jy]=0; } } assert(iNtcTh==nNtcTh); } } //std::cout << "Done coarse trigger cells" << std::endl; for(unsigned ix(0);ixFill(fNtcAdc[kNtcReal][ix][iy],fNtcAdc[m][ix][iy]); hNtcAdcConversion1[m]->Fill(fNtcAdc[kNtcReal][ix][iy],fNtcAdc[m][ix][iy]); hNtcAdcConversion2[m]->Fill(fNtcAdc[kNtcReal][ix][iy],fNtcAdc[m][ix][iy]); hNtcAdcDeltaConversion0[m]->Fill(fNtcAdc[kNtcReal][ix][iy],int(fNtcAdc[m][ix][iy])-int(fNtcAdc[kNtcReal][ix][iy])); hNtcAdcDeltaConversion1[m]->Fill(fNtcAdc[kNtcReal][ix][iy],int(fNtcAdc[m][ix][iy])-int(fNtcAdc[kNtcReal][ix][iy])); hNtcAdcDeltaConversion2[m]->Fill(fNtcAdc[kNtcReal][ix][iy],int(fNtcAdc[m][ix][iy])-int(fNtcAdc[kNtcReal][ix][iy])); if(fNtcAdc[kNtcReal][ix][iy]>0) { hNtcAdcFracConversion0[m]->Fill(fNtcAdc[kNtcReal][ix][iy],(int(fNtcAdc[m][ix][iy])-int(fNtcAdc[kNtcReal][ix][iy]))/(1.0*fNtcAdc[kNtcReal][ix][iy])); hNtcAdcFracConversion1[m]->Fill(fNtcAdc[kNtcReal][ix][iy],(int(fNtcAdc[m][ix][iy])-int(fNtcAdc[kNtcReal][ix][iy]))/(1.0*fNtcAdc[kNtcReal][ix][iy])); hNtcAdcFracConversion2[m]->Fill(fNtcAdc[kNtcReal][ix][iy],(int(fNtcAdc[m][ix][iy])-int(fNtcAdc[kNtcReal][ix][iy]))/(1.0*fNtcAdc[kNtcReal][ix][iy])); } } } //std::cout << "Ntc method " << m << " sum = " << nTcSum[m] << ", Sc sum = " << nScSum << std::endl; if(m!=kNtcEqualShare && m!=kNtcThreshold && m!=kNtcThresholdEqualShare && m!=kNtcSuperTcs && m0) chiSq[1]+=pow((int(fNtcAdc[m][jx][jy])-int(fNtcAdc[kNtcReal][jx][jy]))/(1.0*fNtcAdc[kNtcReal][jx][jy]),2); } } hNtcAdcChiSq0[m]->Fill(chiSq[0]); hNtcAdcChiSq1[m]->Fill(chiSq[1]); numChiSq0[m]++; sumChiSq0[m]+=chiSq[0]; numChiSq1[m]++; sumChiSq1[m]+=chiSq[1]; } } hNtcAdcChiSqAvg0->SetBinContent(m+1,sumChiSq0[m]/numChiSq0[m]); hNtcAdcChiSqAvg1->SetBinContent(m+1,sumChiSq1[m]/numChiSq1[m]); } #ifdef CRAP unsigned nSum[5]={0,0,0,0,0}; unsigned nSum2[kNumberOfNtcMethods]={0,0,0,0,0,0,0}; unsigned nSum3[kNumberOfCtcMethods]={0,0,0,0}; for(unsigned ix(0);ix=mipT2) fNtcAdc[1][ix][iy]=fNtcAdc[0][ix][iy]; } } for(unsigned ix(0);ixFill(ix,iy,a.scTotalEnergy(ix,iy)); hTrueEnergyTcCm->Fill(a.sensorCellPosition(ix),a.sensorCellPosition(iy),a.scTrueEnergy(ix,iy)/tcArea); h2[0][1]->Fill(ix,iy,a.scAdcEnergy(ix,iy,0)); } } for(unsigned ix(0);ixFill(ix,iy,a.tcAdcEnergy(ix,iy,m)/tcArea); hTcAdcEnergyCm[m]->Fill(a.triggerCellPosition(ix),a.triggerCellPosition(iy),a.tcAdcEnergy(ix,iy,m)/tcArea); } } } tcArea*=4.0; /* for(unsigned ix(0);ixFill(ix,iy,a.ctcAdcEnergy(ix,iy,m)/tcArea); } } } tcArea*=(a.fHiDensity?2.0:4.0); for(unsigned ix(0);ixFill(ix,iy,a.htcAdcEnergy(ix,iy)/tcArea); } } } */ } int main(int argc, const char **argv) { unsigned place(0); bool ez(true); bool pu(true); double fLayerZ(330.0); double fPt=40.0; //fPt=1000.0; double fPtSpread=0.5; //double fEta=3.0; double fMipsPerGeV(10.0); if(argc>4) { std::cerr << "Usage: " << argv[0] << " h or l" << std::endl; return 1; } if(argc==2) { std::istringstream sin(argv[1]); sin >> place; } if(argc==3) { if(argv[2][0]=='e') ez=true; if(argv[2][0]=='z') ez=false; } if(argc==4) { if(argv[3][0]=='p') pu=true; if(argv[3][0]=='u') pu=false; } TFileHandler tfh(std::string("SuperTCs")+(place==0?"0":"1")); PackerFloat22 aPacker(4,7); unsigned bins(1<<22); TH1F *hPackerA=new TH1F("ScPackerA",";Input;Output",bins,0,bins); TH1F *hPackerD=new TH1F("ScPackerD",";Input;Output-Input",bins,0,bins); TH1F *hPackerR=new TH1F("ScPackerR",";Input;(Output-Input)/Input",bins,0,bins); for(unsigned i(0);iSetBinContent(i+1,op); hPackerD->SetBinContent(i+1,int(op)-int(i)); if(i>0) hPackerR->SetBinContent(i+1,(int(op)-int(i))/(1.0*i)); } PackerFloat22 bPacker(4,3); bins=bPacker.dataMax()+1; TH1F *hBPackerA=new TH1F("ScBPackerA",";Input;Output",bins,-0.5,bins-0.5); TH1F *hBPackerD=new TH1F("ScBPackerD",";Input;Output-Input",bins,-0.5,bins-0.5); TH1F *hBPackerR=new TH1F("ScBPackerR",";Input;(Output-Input)/Input",bins,-0.5,bins-0.5); TH1F *hCPackerA=new TH1F("ScCPackerA",";Input;Output",bins,-0.5,bins-0.5); TH1F *hCPackerD=new TH1F("ScCPackerD",";Input;Output-Input",bins,-0.5,bins-0.5); TH1F *hCPackerR=new TH1F("ScCPackerR",";Input;(Output-Input)/Input",bins,-0.5,bins-0.5); for(unsigned i(0);iSetBinContent(i+1,op); hBPackerD->SetBinContent(i+1,int(op)-int(i)); if(i>0) hBPackerR->SetBinContent(i+1,(int(op)-int(i))/(1.0*i)); op=bPacker.unpackTimes2(); hCPackerA->SetBinContent(i+1,op/2.0); hCPackerD->SetBinContent(i+1,int(op)/2.0-int(i)); if(i>0) hCPackerR->SetBinContent(i+1,(int(op)/2.0-int(i))/(1.0*i)); } //const double dTriggerCells(sqrt(4.908)); //const unsigned nSensorCells[2]={36,24}; //const double dSensorCells[2]={dTriggerCells/3.0,dTriggerCells/2.0}; //const unsigned nDensity(0); Array theArray(place,ez,pu); PhotonModel thePhotonModel[3]; thePhotonModel[0]=PhotonModel(0,0.61); //thePhotonModel[1]=PhotonModel(1,3.0); thePhotonModel[1]=PhotonModel(1,0.059); thePhotonModel[2]=PhotonModel(2,1.05); unsigned usePhotonModel(1); double nrg(200.0); TH2F *hCentre=new TH2F("Centre",";x (cm);y(cm)", 10*theArray.numberOfTriggerCells(), -theArray.fArrayHalfSide,theArray.fArrayHalfSide, 10*theArray.numberOfTriggerCells(), -theArray.fArrayHalfSide,theArray.fArrayHalfSide); unsigned nScEventTotal(theArray.numberOfSensorCells()*theArray.numberOfSensorCells()); unsigned nTcEventTotal(theArray.numberOfTriggerCells()*theArray.numberOfTriggerCells()); TH2F *hNtcCountVsR[2]; hNtcCountVsR[0]=new TH2F("NtcCountVsR0", ";Cut radius #rho;Number of trigger cells", kNumberOfRadii,0.0,0.06,300,0,300); hNtcCountVsR[1]=new TH2F("NtcCountVsR1", ";Cut radius #rho;Number of trigger cells", kNumberOfRadii,0.0,0.06,300,0,300); for(unsigned r(0);rFill(cutRadius(r),n[0]); for(unsigned jx(0);jx<100;jx++) { for(unsigned jy(0);jy<100;jy++) { n[1]=0; for(unsigned ix(0);ixFill(cutRadius(r),n[1],0.0001); } } } TH1F *hScReadout=new TH1F("ScReadout",";Number of sensor cells",nScEventTotal,0,nScEventTotal); TH1F *hScEnergyTrue=new TH1F("ScEnergyTrue",";Energy (MIPs)",100,0.0,50*nrg); TE1F *hScEnergyIntegral=new TE1F("ScEnergyIntegral",";Radius (cm);Energy (MIPs)",100,0.0,5.0,false); TH1F *hScEnergySpectrum=new TH1F("ScEnergySpectrum",";Energy (MIPs)",120,-2.0,10.0); // unsigned nr(10); TH2F *hScResponse[Array::kNumberOfScMethods][kNumberOfRadii]; TH1A *hAScResponse[Array::kNumberOfScMethods][kNumberOfRadii]; TH2F *hNtcResponse[2][Array::kNumberOfNtcMethods][kNumberOfRadii]; TH1A *hANtcResponse[2][Array::kNumberOfNtcMethods][kNumberOfRadii]; /* TH2F *hStcResponse[kNumberOfRadii],*hFtcResponse[kNumberOfRadii]; TH2F *hTrueCtcResponse[kNumberOfRadii],*hCtcResponse[Array::kNumberOfCtcMethods][kNumberOfRadii]; TH2F *hTrueHtcResponse[kNumberOfRadii],*hHtcResponse[kNumberOfRadii]; TH1A *hATrueScResponse[kNumberOfRadii],*hAScResponse[kNumberOfRadii]; TH1A *hATrueTcResponse[kNumberOfRadii],*hATcResponse[Array::kNumberOfNtcMethods][kNumberOfRadii]; TH1A *hAStcResponse[kNumberOfRadii],*hAFtcResponse[kNumberOfRadii]; TH1A *hATrueCtcResponse[kNumberOfRadii],*hACtcResponse[Array::kNumberOfCtcMethods][kNumberOfRadii]; TH1A *hATrueHtcResponse[kNumberOfRadii],*hAHtcResponse[kNumberOfRadii]; */ for(unsigned m(0);mFill(centre[0],centre[1]); unsigned nScEventReadout(0); unsigned nTcEventReadout(0); // Process the event theArray.initialise(); double sigma(2.0); double sigma2(2.0*sigma*sigma); double trueEnergy(0.0); double thisEnergy(fMipsPerGeV*fPt*cosh(theArray.fEta)); //double thisEnergy((0.1+0.9*Random::random().Uniform())*nrg); unsigned modelBins(4); double modelBinsSize(theArray.fSensorCellSide/modelBins); double modelBinsArea(modelBinsSize*modelBinsSize); for(unsigned ix(0);ixFill(dr,de); e+=de; } } e*=std::max(Random::random().Gaus(1.0,fPtSpread),0.0); trueEnergy+=e; theArray.increment(ix,iy,e); } } if(nEvt<10) std::cout << "This, true energy = " << thisEnergy << ", " << trueEnergy << " MIPs" << std::endl; hScEnergyTrue->Fill(trueEnergy); theArray.digitise(0); if(nEvt<10) std::cout << "Completed digitisation" << std::endl; // Analyse the event if(nEvt<5) histEvent(nEvt,theArray); for(unsigned r(0);r0) nScEventReadout++; unsigned m=Array::kScReal; hScEnergySpectrum->Fill(theArray.scTotalEnergy(ix,iy)); hScAdcSpectrum->Fill(theArray.fScAdc[m][ix][iy]); hScAdcEnergySpectrum->Fill(theArray.scAdcEnergy(ix,iy,m)); hScAdcVsEnergy0->Fill(theArray.scTotalEnergy(ix,iy),theArray.scAdcEnergy(ix,iy,m)); hScAdcVsEnergy1->Fill(theArray.scTotalEnergy(ix,iy),theArray.scAdcEnergy(ix,iy,m)); hScAdcVsEnergy2->Fill(theArray.scTotalEnergy(ix,iy),theArray.scAdcEnergy(ix,iy,m)); hScAdcVsEnergy3->Fill(theArray.scTotalEnergy(ix,iy),theArray.scAdcEnergy(ix,iy,m)); double dx(theArray.sensorCellPosition(ix)-centre[0]); double dy(theArray.sensorCellPosition(iy)-centre[1]); double dr(sqrt(dx*dx+dy*dy)); for(unsigned m(0);mFill(nScEventReadout); nScTotal+=nScEventTotal; nScReadout+=nScEventReadout; for(unsigned m(0);mFill(trueEnergy,scResponse[m][r]); hAScResponse[m][r]->Fill(trueEnergy,scResponse[m][r]); } } //////////////////////////////////////////////////////////////// for(unsigned ix(0);ix0.0) nTcEventReadout++; /* if(theArray.fStcAdc[ix][iy]>0) { unsigned nx((ix%2)==0?ix+1:ix-1); unsigned ny((iy%2)==0?iy+1:iy-1); assert(theArray.fStcAdc[nx][iy]==0); assert(theArray.fStcAdc[ix][ny]==0); assert(theArray.fStcAdc[nx][ny]==0); hTcAdcRatio0->Fill(1.0*theArray.fTcAdc[ix][iy]/theArray.fStcAdc[ix][iy]); hTcAdcRatio0VsStcAdc->Fill(theArray.fStcAdc[ix][iy],1.0*theArray.fTcAdc[ix][iy]/theArray.fStcAdc[ix][iy]); hTcAdcRatio1->Fill(1.0*theArray.fTcAdc[nx][iy]/theArray.fTcAdc[ix][iy]); hTcAdcRatio1->Fill(1.0*theArray.fTcAdc[ix][ny]/theArray.fTcAdc[ix][iy]); hTcAdcRatio1VsStcAdc->Fill(theArray.fStcAdc[ix][iy],1.0*theArray.fTcAdc[nx][iy]/theArray.fTcAdc[ix][iy]); hTcAdcRatio1VsStcAdc->Fill(theArray.fStcAdc[ix][iy],1.0*theArray.fTcAdc[ix][ny]/theArray.fTcAdc[ix][iy]); hTcAdcRatio2->Fill(1.0*theArray.fTcAdc[nx][ny]/theArray.fTcAdc[ix][iy]); hTcAdcRatio2VsStcAdc->Fill(theArray.fStcAdc[ix][iy],1.0*theArray.fTcAdc[nx][ny]/theArray.fTcAdc[ix][iy]); } */ for(unsigned m(0);mFill(theArray.tcAdcEnergy(ix,iy,m)); hTcAdcVsEnergy0[m]->Fill(theArray.tcTotalEnergy(ix,iy),theArray.tcAdcEnergy(ix,iy,m)); hTcAdcVsEnergy1[m]->Fill(theArray.tcTotalEnergy(ix,iy),theArray.tcAdcEnergy(ix,iy,m)); hTcAdcVsEnergy2[m]->Fill(theArray.tcTotalEnergy(ix,iy),theArray.tcAdcEnergy(ix,iy,m)); hTcAdcVsEnergy3[m]->Fill(theArray.tcTotalEnergy(ix,iy),theArray.tcAdcEnergy(ix,iy,m)); } /* hStcAdcEnergySpectrum->Fill(theArray.stcAdcEnergy(ix,iy)); hStcAdcVsEnergy0->Fill(theArray.tcTotalEnergy(ix,iy),theArray.stcAdcEnergy(ix,iy)); hStcAdcVsEnergy1->Fill(theArray.tcTotalEnergy(ix,iy),theArray.stcAdcEnergy(ix,iy)); hStcAdcVsEnergy2->Fill(theArray.tcTotalEnergy(ix,iy),theArray.stcAdcEnergy(ix,iy)); hStcAdcVsEnergy3->Fill(theArray.tcTotalEnergy(ix,iy),theArray.stcAdcEnergy(ix,iy)); hFtcAdcEnergySpectrum->Fill(theArray.ftcAdcEnergy(ix,iy)); hFtcAdcVsEnergy0->Fill(theArray.tcTotalEnergy(ix,iy),theArray.ftcAdcEnergy(ix,iy)); hFtcAdcVsEnergy1->Fill(theArray.tcTotalEnergy(ix,iy),theArray.ftcAdcEnergy(ix,iy)); hFtcAdcVsEnergy2->Fill(theArray.tcTotalEnergy(ix,iy),theArray.ftcAdcEnergy(ix,iy)); hFtcAdcVsEnergy3->Fill(theArray.tcTotalEnergy(ix,iy),theArray.ftcAdcEnergy(ix,iy)); */ double dx; double dy; for(unsigned ic(0);ic<2;ic++) { if(ic==0) { dx=theArray.triggerCellPosition(ix)-centre[0]; dy=theArray.triggerCellPosition(iy)-centre[1]; } else { unsigned icx(theArray.triggerCellNumber(centre[0])); unsigned icy(theArray.triggerCellNumber(centre[1])); dx=theArray.triggerCellPosition(ix)-theArray.triggerCellPosition(icx); dy=theArray.triggerCellPosition(iy)-theArray.triggerCellPosition(icy); } double dr(sqrt(dx*dx+dy*dy)); for(unsigned m(0);mFill(nTcEventReadout); nTcTotal+=nTcEventTotal; nTcReadout+=nTcEventReadout; for(unsigned m(0);mFill(trueEnergy,ntcResponse[0][m][r]); hANtcResponse[0][m][r]->Fill(trueEnergy,ntcResponse[0][m][r]); hNtcResponse[1][m][r]->Fill(trueEnergy,ntcResponse[1][m][r]); hANtcResponse[1][m][r]->Fill(trueEnergy,ntcResponse[1][m][r]); } } //////////////////////////////////////////////////////////////// #ifdef CRAP for(unsigned ix(0);ixFill(theArray.ctcAdcEnergy(ix,iy,m)); hCtcAdcVsEnergy0->Fill(theArray.tcTotalEnergy(ix,iy),theArray.ctcAdcEnergy(ix,iy,m)); hCtcAdcVsEnergy1->Fill(theArray.tcTotalEnergy(ix,iy),theArray.ctcAdcEnergy(ix,iy,m)); hCtcAdcVsEnergy2->Fill(theArray.tcTotalEnergy(ix,iy),theArray.ctcAdcEnergy(ix,iy,m)); hCtcAdcVsEnergy3->Fill(theArray.tcTotalEnergy(ix,iy),theArray.ctcAdcEnergy(ix,iy,m)); } double dx(theArray.coarseCellPosition(ix)-centre[0]); double dy(theArray.coarseCellPosition(iy)-centre[1]); double dr(sqrt(dx*dx+dy*dy)); for(unsigned r(0);rFill(trueEnergy,trueCtcR[r]); hATrueCtcResponse[r]->Fill(trueEnergy,trueCtcR[r]); for(unsigned m(0);mFill(trueEnergy,ctcR[m][r]); hACtcResponse[m][r]->Fill(trueEnergy,ctcR[m][r]); } } //////////////////////////////////////////////////////////////// for(unsigned ix(0);ixFill(trueEnergy,trueHtcR[r]); hATrueHtcResponse[r]->Fill(trueEnergy,trueHtcR[r]); hHtcResponse[r]->Fill(trueEnergy,htcR[r]); hAHtcResponse[r]->Fill(trueEnergy,htcR[r]); } #endif } // End of event loop //////////////////////////////////////////////////////////////// std::cout << "Total, read out sensor cells = " << nScTotal << ", " << nScReadout << ", occupancy = " << 1.0*nScReadout/nScTotal << std::endl; std::cout << "Total, read out trigger cells = " << nTcTotal << ", " << nTcReadout << ", occupancy = " << 1.0*nTcReadout/nTcTotal << std::endl; std::cout << std::endl; double trueRms(sqrt(xScMs[0]/nScMs[0])); std::cout << "Number, sumSq and RMS for true energy sensor cells = " << nScMs[0] << ", " << xScMs[0] << ", " << sqrt(xScMs[0]/nScMs[0]) << ", " << sqrt(xScMs[0]/nScMs[0])/trueRms << std::endl; std::cout << "Number, sumSq and RMS for ADC energy sensor cells = " << nScMs[1] << ", " << xScMs[1] << ", " << sqrt(xScMs[1]/nScMs[1]) << ", " << sqrt(xScMs[1]/nScMs[1])/trueRms << std::endl; std::cout << std::endl; for(unsigned m(0);mAvg(); TH1F *hRms=hAScResponse[m][r]->Rms(); std::cout << "Sc method " << m << ", radius " << fLayerZ*cutRadius(r) << ", entries and integral = " << hAvg->GetEntries() << ", " << hAvg->Integral() << std::endl; if(hAvg->Integral()>100) { hAvg->Fit("pol1"); hAvg->GetFunction("pol1")->GetParameters(parAvg); hScClVsR[m]->SetBinContent(r+1,parAvg[1]); hScPuVsR[m]->SetBinContent(r+1,parAvg[0]/parAvg[1]); hRms->Fit(sFit.c_str()); hRms->GetFunction(sFit.c_str())->GetParameters(parRms); double typical=(*(hRms->GetFunction(sFit.c_str())))(4000)/parAvg[1]; std::cout << "Sc method " << m << ", radius " << fLayerZ*cutRadius(r) << ", typical RMS = " << typical; hScEsVsR[m]->SetBinContent(r+1,typical); hAvg->RecursiveRemove(hAvg->GetFunction("pol1")); hRms->RecursiveRemove(hRms->GetFunction(sFit.c_str())); if(minRms>typical) { minRms=typical; minR=fLayerZ*cutRadius(r); std::cout << " new min" << std::endl; } else { std::cout << std::endl; } } } std::cout << "Sc, method " << m << ", min radius " << minR << ", typical RMS = " << minRms << " <<<=======" << std::endl << std::endl; } TH1F *hNtcEsVsR[2][Array::kNumberOfNtcMethods]; TH1F *hNtcClVsR[2][Array::kNumberOfNtcMethods]; TH1F *hNtcPuVsR[2][Array::kNumberOfNtcMethods]; for(unsigned m(0);mAvg(); TH1F *hRms=hANtcResponse[ic][m][r]->Rms(); std::cout << "Ntc method " << m << ", radius " << fLayerZ*cutRadius(r) << ", entries and integral = " << hAvg->GetEntries() << ", " << hAvg->Integral() << std::endl; if(hAvg->Integral()>100) { hAvg->Fit("pol1"); hAvg->GetFunction("pol1")->GetParameters(parAvg); hNtcClVsR[ic][m]->SetBinContent(r+1,parAvg[1]); hNtcPuVsR[ic][m]->SetBinContent(r+1,parAvg[0]/parAvg[1]); hRms->Fit(sFit.c_str()); hRms->GetFunction(sFit.c_str())->GetParameters(parRms); double typical=(*(hRms->GetFunction(sFit.c_str())))(4000)/parAvg[1]; std::cout << "Ntc method " << m << ", radius " << fLayerZ*cutRadius(r) << ", typical RMS = " << typical; hNtcEsVsR[ic][m]->SetBinContent(r+1,typical); hAvg->RecursiveRemove(hAvg->GetFunction("pol1")); hRms->RecursiveRemove(hRms->GetFunction(sFit.c_str())); if(minRms>typical) { minRms=typical; minR=fLayerZ*cutRadius(r); std::cout << " new min" << std::endl; } else { std::cout << std::endl; } } } std::cout << "Centre method " << ic << ", Ntc method " << m << ", min radius " << minR << ", typical RMS = " << minRms << " <<<=======" << std::endl << std::endl; } } /* for(unsigned m(0);mAvg(); TH1F *hRms=hACtcResponse[m][r]->Rms(); hAvg->Fit("pol1"); hAvg->GetFunction("pol1")->GetParameters(parAvg); hRms->Fit(sFit.c_str()); hRms->GetFunction(sFit.c_str())->GetParameters(parRms); hCtcClVsR->SetBinContent(r+1,parAvg[0]); hCtcPuVsR->SetBinContent(r+1,parAvg[0]); double typical=(*(hRms->GetFunction(sFit.c_str())))(4000)/parAvg[1]; std::cout << "Sc, radius " << fLayerZ*cutRadius(r) << ", typical RMS = " << typical; hCtcEsVsR->SetBinContent(r+1,typical); hAvg->RecursiveRemove(hAvg->GetFunction("pol1")); hRms->RecursiveRemove(hRms->GetFunction(sFit.c_str())); if(minRms>typical) { minRms=typical; minR=fLayerZ*cutRadius(r); std::cout << " new min" << std::endl; } else { std::cout << std::endl; } } std::cout << "Ctc method " << m << ", min radius " << minR << ", typical RMS = " << minRms << " <<<=======" << std::endl << std::endl; } minRms=1.0e12; minR=-1.0; TH1F *hHtcEsVsR=new TH1F("HtcEsVsR",";Cut radius #rho;Energy resolution (MIPs)", kNumberOfRadii,0.0075,0.0575); TH1F *hHtcPuVsR=new TH1F("HtcPuVsR",";Cut radius #rho;Pileup (MIPs)", kNumberOfRadii,0.0075,0.0575); for(unsigned r(0);rAvg(); TH1F *hRms=hAHtcResponse[r]->Rms(); hAvg->Fit("pol1"); hAvg->GetFunction("pol1")->GetParameters(parAvg); hRms->Fit(sFit.c_str()); hRms->GetFunction(sFit.c_str())->GetParameters(parRms); hHtcPuVsR->SetBinContent(r+1,parAvg[0]); double typical=(*(hRms->GetFunction(sFit.c_str())))(4000)/parAvg[1]; std::cout << "Htc, radius " << fLayerZ*cutRadius(r) << ", typical RMS = " << typical; hHtcEsVsR->SetBinContent(r+1,typical); hAvg->RecursiveRemove(hAvg->GetFunction("pol1")); hRms->RecursiveRemove(hRms->GetFunction(sFit.c_str())); if(minRms>typical) { minRms=typical; minR=fLayerZ*cutRadius(r); std::cout << " new min" << std::endl; } else { std::cout << std::endl; } } std::cout << "Htc, min radius " << minR << ", typical RMS = " << minRms << " <<<=======" << std::endl << std::endl; } */ } return 0; }