1 #include "AliPHOSDA1.h"
6 //----------------------------------------------------------------
7 AliPHOSDA1::AliPHOSDA1(int module) : TNamed(),
8 fHistoFile(0),fMod(module),fWriteToFile(kTRUE)
11 // Create DA1 ("Calibration DA") object.
12 // module is the PHOS module number (0..4).
13 // Checks existence of histograms which might have been left
14 // from the previous runs to continue their filling.
15 // Histogram names: module_iX_iZ_gain for TH2 and module_iX_iZ for TH1.
16 // Root file name: PHOS_ModuleX_Calib.root, where X - module number.
19 sprintf(name,"PHOS_Module%d_Calib",fMod);
22 SetTitle("Calibration Detector Algorithm");
25 sprintf(rootname,"%s.root",GetName());
27 fHistoFile = new TFile(rootname,"update");
33 for(Int_t iX=0; iX<64; iX++) {
34 for(Int_t iZ=0; iZ<56; iZ++) {
36 sprintf(hname,"%d_%d_%d",fMod,iX,iZ);
37 hist1 = (TH1F*)fHistoFile->Get(hname);
38 if(hist1) fHgLgRatio[iX][iZ] = hist1;
40 fHgLgRatio[iX][iZ] = 0;
42 for(Int_t iGain=0; iGain<2; iGain++) {
43 sprintf(hname,"%d_%d_%d_%d",fMod,iX,iZ,iGain);
44 hist2 = (TH2F*)fHistoFile->Get(hname);
45 if(hist2) fTimeEnergy[iX][iZ][iGain] = hist2;
47 fTimeEnergy[iX][iZ][iGain] = 0;
55 //-------------------------------------------------------------------
56 AliPHOSDA1::AliPHOSDA1(Int_t module, TH2F oldTimeEnergy[64][56][2]) :
57 TNamed(),fHistoFile(0),fMod(module),fWriteToFile(kFALSE)
60 // oldTimeEnergy is an array of histograms kept from the previous run.
61 // By default the final histograms will not be saved to the root file.
64 sprintf(name,"PHOS_Module%d_Calib",fMod);
67 SetTitle("Calibration Detector Algorithm");
71 for(Int_t iX=0; iX<64; iX++) {
72 for(Int_t iZ=0; iZ<56; iZ++) {
73 for(Int_t iGain=0; iGain<2; iGain++) {
75 if((&(oldTimeEnergy[iX][iZ][iGain]))->GetEntries())
76 fTimeEnergy[iX][iZ][iGain] = &(oldTimeEnergy[iX][iZ][iGain]);
78 fTimeEnergy[iX][iZ][iGain] = 0;
87 //-------------------------------------------------------------------
88 AliPHOSDA1::AliPHOSDA1(const AliPHOSDA1& da) : TNamed(da),
89 fHistoFile(0),fMod(da.fMod),fWriteToFile(da.fWriteToFile)
93 fHistoFile = new TFile(da.GetName(),"update");
99 for(Int_t iX=0; iX<64; iX++) {
100 for(Int_t iZ=0; iZ<56; iZ++) {
102 sprintf(hname,"%d_%d_%d",fMod,iX,iZ);
103 hist1 = (TH1F*)da.fHistoFile->Get(hname);
104 if(hist1) fHgLgRatio[iX][iZ] = hist1;
106 fHgLgRatio[iX][iZ] = 0;
108 for(Int_t iGain=0; iGain<2; iGain++) {
109 sprintf(hname,"%d_%d_%d_%d",fMod,iX,iZ,iGain);
110 hist2 = (TH2F*)da.fHistoFile->Get(hname);
111 if(hist2) fTimeEnergy[iX][iZ][iGain] = hist2;
113 fTimeEnergy[iX][iZ][iGain] = 0;
121 //-------------------------------------------------------------------
122 AliPHOSDA1& AliPHOSDA1::operator= (const AliPHOSDA1& da)
124 //Assignment operator.
128 TString oldname(fHistoFile->GetName());
129 TString newname(da.fHistoFile->GetName());
131 if(oldname != newname) {
133 fHistoFile = new TFile(da.fHistoFile->GetName(),"update");
138 SetName(da.GetName());
139 SetTitle(da.GetTitle());
141 for(Int_t iX=0; iX<64; iX++) {
142 for(Int_t iZ=0; iZ<56; iZ++) {
144 if(fHgLgRatio[iX][iZ]) delete fHgLgRatio[iX][iZ];
145 fHgLgRatio[iX][iZ] = da.fHgLgRatio[iX][iZ];
147 for(Int_t iGain=0; iGain<2; iGain++) {
148 if (fTimeEnergy[iX][iZ][iGain]) delete fTimeEnergy[iX][iZ][iGain];
149 fTimeEnergy[iX][iZ][iGain] = da.fTimeEnergy[iX][iZ][iGain];
161 //-------------------------------------------------------------------
162 AliPHOSDA1::~AliPHOSDA1()
167 if(fHistoFile) delete fHistoFile;
171 //-------------------------------------------------------------------
172 void AliPHOSDA1::FillHistograms(Float_t e[64][56][2], Float_t t[64][56][2])
174 // Fill energy vs time-of-flight and HG/LG ratio histograms in one event.
175 // Energy and TOF data are encoded as e[X][Z][gain] and t[X][Z][gain],
176 // where X(0..63) and Z(0..55) - crystal position in the module,
177 // gain=0 - low gain, gain=1 - high gain.
178 // Energy in ADC counts, time in samples.
179 // If no energy or time read for particular channel,
180 // the correspondent array entry should be filled by zero.
181 // WARNING: this function should be called once per event!
186 for(Int_t iX=0; iX<64; iX++) {
187 for (Int_t iZ=0; iZ<56; iZ++) {
190 if(e[iX][iZ][0] && e[iX][iZ][1]) {
191 if(fHgLgRatio[iX][iZ]) {
192 // printf("iX=%d iZ=%d,e[iX][iZ][1]=%.3f,e[iX][iZ][0]=%.3f, t1=%.3f,t0=%.3f\n",
193 // iX,iZ,e[iX][iZ][1],e[iX][iZ][0], t[iX][iZ][1],t[iX][iZ][0]);
194 fHgLgRatio[iX][iZ]->Fill(e[iX][iZ][1]/e[iX][iZ][0]);
198 sprintf(hname,"%d_%d_%d",fMod,iX,iZ);
199 sprintf(htitl,"HG/LG ratio for crystal %d_%d_%d",fMod,iX,iZ);
200 fHgLgRatio[iX][iZ] = new TH1F(hname,htitl,400,14.,18.);
201 // printf("iX=%d iZ=%d,e[iX][iZ][1]=%.3f,e[iX][iZ][0]=%.3f\n",
202 // iX,iZ,e[iX][iZ][1],e[iX][iZ][0]);
203 fHgLgRatio[iX][iZ]->Fill(e[iX][iZ][1]/e[iX][iZ][0]);
208 for(Int_t iGain=0; iGain<2; iGain++) {
209 if(!e[iX][iZ][iGain]) continue;
211 if(fTimeEnergy[iX][iZ][iGain])
212 fTimeEnergy[iX][iZ][iGain]->Fill(e[iX][iZ][iGain],t[iX][iZ][iGain]);
214 sprintf(hname,"%d_%d_%d_%d",fMod,iX,iZ,iGain);
215 sprintf(htitl,"Energy vs TOF for crystal %d_%d_%d and gain %d",fMod,iX,iZ,iGain);
216 fTimeEnergy[iX][iZ][iGain] = new TH2F(hname,htitl,1024,0.,1024.,100,0.,100);
217 fTimeEnergy[iX][iZ][iGain]->Fill(e[iX][iZ][iGain],t[iX][iZ][iGain]);
226 //-------------------------------------------------------------------
227 void AliPHOSDA1::UpdateHistoFile()
229 // Write histograms to file
231 if(!fWriteToFile) return;
232 if(!fHistoFile) return;
233 if(!fHistoFile->IsOpen()) return;
238 for(Int_t iX=0; iX<64; iX++) {
239 for(Int_t iZ=0; iZ<56; iZ++) {
241 hist1 = fHgLgRatio[iX][iZ];
242 if(hist1) hist1->Write(hist1->GetName(),TObject::kWriteDelete);
244 for(Int_t iGain=0; iGain<2; iGain++) {
245 hist2 = fTimeEnergy[iX][iZ][iGain];
246 if(hist2) hist2->Write(hist2->GetName(),TObject::kWriteDelete);
254 //-----------------------------------------------------------------------
255 void AliPHOSDA1::SetWriteToFile(Bool_t write)
258 fWriteToFile = write;
264 sprintf(rootname,"%s.root",GetName());
265 fHistoFile = new TFile(rootname,"update");
268 fWriteToFile = write;