source: trunk/MagicSoft/Mars/manalysis/MCerPhotAnal.cc@ 1619

Last change on this file since 1619 was 1557, checked in by tbretz, 22 years ago
*** empty log message ***
File size: 6.1 KB
Line 
1/* ======================================================================== *\
2!
3! *
4! * This file is part of MARS, the MAGIC Analysis and Reconstruction
5! * Software. It is distributed to you in the hope that it can be a useful
6! * and timesaving tool in analysing Data of imaging Cerenkov telescopes.
7! * It is distributed WITHOUT ANY WARRANTY.
8! *
9! * Permission to use, copy, modify and distribute this software and its
10! * documentation for any purpose is hereby granted without fee,
11! * provided that the above copyright notice appear in all copies and
12! * that both that copyright notice and this permission notice appear
13! * in supporting documentation. It is provided "as is" without express
14! * or implied warranty.
15! *
16!
17!
18! Author(s): Thomas Bretz 12/2000 <mailto:tbretz@uni-sw.gwdg.de>
19!
20! Copyright: MAGIC Software Development, 2000-2001
21!
22!
23\* ======================================================================== */
24
25//////////////////////////////////////////////////////////////////////////////
26// //
27// MCerPhotAnal //
28// //
29// This is a task which calculates the number of photons from the FADC //
30// time slices. At the moment it integrates simply the FADC values. //
31// //
32// Input Containers: //
33// MRawEvtData, MPedesdtalCam //
34// //
35// Output Containers: //
36// MCerPhotEvt //
37// //
38//////////////////////////////////////////////////////////////////////////////
39
40#include "MCerPhotAnal.h"
41
42#include "MParList.h"
43
44#include "MLog.h"
45#include "MLogManip.h"
46
47#include "MRawRunHeader.h"
48#include "MRawEvtData.h" // MRawEvtData::GetNumPixels
49#include "MCerPhotEvt.h"
50#include "MPedestalPix.h"
51#include "MPedestalCam.h"
52#include "MRawEvtPixelIter.h"
53
54ClassImp(MCerPhotAnal);
55
56// --------------------------------------------------------------------------
57//
58// Default constructor.
59//
60MCerPhotAnal::MCerPhotAnal(const char *name, const char *title)
61{
62 fName = name ? name : "MCerPhotAnal";
63 fTitle = title ? title : "Task to calculate Cerenkov photons from raw data";
64
65 AddToBranchList("MRawEvtData.fHiGainPixId");
66 AddToBranchList("MRawEvtData.fLoGainPixId");
67 AddToBranchList("MRawEvtData.fHiGainFadcSamples");
68 AddToBranchList("MRawEvtData.fLoGainFadcSamples");
69
70}
71
72// --------------------------------------------------------------------------
73//
74// The PreProcess searches for the following input containers:
75// - MRawRunHeader
76// - MRawEvtData
77// - MPedestalCam
78//
79// The following output containers are also searched and created if
80// they were not found:
81// - MCerPhotEvt
82//
83Bool_t MCerPhotAnal::PreProcess(MParList *pList)
84{
85 fRunHeader = (MRawRunHeader*)pList->FindObject("MRawRunHeader");
86 if (!fRunHeader)
87 {
88 *fLog << dbginf << "MRawRunHeader not found... aborting." << endl;
89 return kFALSE;
90 }
91
92 fRawEvt = (MRawEvtData*)pList->FindObject("MRawEvtData");
93 if (!fRawEvt)
94 {
95 *fLog << dbginf << "MRawEvtData not found... aborting." << endl;
96 return kFALSE;
97 }
98
99 fPedestals = (MPedestalCam*)pList->FindCreateObj("MPedestalCam");
100 if (!fPedestals)
101 {
102 *fLog << dbginf << "MPedestalCam not found... aborting." << endl;
103 return kFALSE;
104 }
105
106 fCerPhotEvt = (MCerPhotEvt*)pList->FindCreateObj("MCerPhotEvt");
107 if (!fCerPhotEvt)
108 return kFALSE;
109
110 return kTRUE;
111}
112
113// --------------------------------------------------------------------------
114//
115// Calculate the integral of the FADC time slices and store them as a new
116// pixel in the MCerPhotEvt container.
117//
118Bool_t MCerPhotAnal::Process()
119{
120 fCerPhotEvt->InitSize(fRawEvt->GetNumPixels());
121
122 MRawEvtPixelIter pixel(fRawEvt);
123
124 while (pixel.Next())
125 {
126 Byte_t *ptr = pixel.GetHiGainSamples();
127 const Byte_t *end = ptr + fRawEvt->GetNumHiGainSamples();
128 const Byte_t *limit = end - 5;
129
130 Int_t sum=0;
131 Int_t sumpeak=0;
132 Int_t sumlocal =0;
133 Int_t slice=0;
134 Int_t slicelocal=0;
135
136 do
137 {
138 sumlocal = 0;
139 for (Int_t i = 0; i<5;i++)
140 sumlocal += *(ptr+i);
141
142 if (sumpeak < sumlocal)
143 {
144 slice=slicelocal;
145 sumpeak = sumlocal;
146 }
147
148 slicelocal++;
149 sum += *ptr;
150 } while (++ptr != limit);
151
152 do sum += *ptr;
153 while (++ptr != end);
154
155 Float_t pedes = (Float_t)(sum-sumpeak)/(fRawEvt->GetNumHiGainSamples()-5);
156 Float_t nphot = (Float_t)sumpeak - 5.0*pedes;
157
158 Float_t sigmaped=0;
159
160 slicelocal=0;
161 sumlocal = 0;
162
163 ptr = pixel.GetHiGainSamples();
164 do
165 {
166 if (slicelocal==slice)
167 ptr += 4;
168 else
169 {
170 sumlocal = *ptr;
171
172 const Float_t d = (Float_t)sumlocal-pedes;
173 sigmaped += d*d;
174 }
175 slicelocal++;
176 }
177 while (++ptr != end);
178
179 sigmaped /= (fRawEvt->GetNumHiGainSamples()-5);
180 sigmaped = sqrt(sumlocal);
181
182 const UInt_t pixid = pixel.GetPixelId();
183
184 MPedestalPix &ped = (*fPedestals)[pixid];
185
186 //
187 // sanity check (old MC files sometimes have pixids>577)
188 //
189 if (!fPedestals->CheckBounds(pixid))
190 {
191 *fLog << inf << "Pixel ID larger than camera... skipping event." << endl;
192 return kCONTINUE;
193 }
194
195 fCerPhotEvt->AddPixel(pixid, nphot, sigmaped/2.236);
196 ped.SetPedestal(pedes, sigmaped);
197 ped.SetPedestalRms(sigmaped/sqrt(fRawEvt->GetNumHiGainSamples()-5),
198 sigmaped/sqrt(2*(fRawEvt->GetNumHiGainSamples()-5)));
199
200 // FIXME! Handling of Lo Gains is missing!
201 }
202
203 fCerPhotEvt->SetReadyToSave();
204
205 return kTRUE;
206}
207
Note: See TracBrowser for help on using the repository browser.