Changeset 3948
- Timestamp:
- 05/03/04 17:32:06 (21 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/MagicSoft/Mars/msignal/MExtractTime.cc
r3942 r3948 1 #ifndef MARS_MExtractTime 2 #define MARS_MExtractTime 3 4 #ifndef MARS_MExtractor 5 #include "MExtractor.h" 6 #endif 7 8 class MPedestalPix; 9 class MArrivalTimeCam; 10 class MExtractTime : public MExtractor 11 { 12 13 MArrivalTimeCam *fArrTime; // Container with the photons arrival times 14 15 virtual Int_t PreProcess(MParList *pList); 16 virtual Bool_t ReInit(MParList *pList); 17 virtual Int_t Process(); 18 19 virtual void FindTimeHiGain(Byte_t *firstused, Float_t &time, Float_t &dtime, 20 Byte_t &sat, const MPedestalPix &ped) const; 21 virtual void FindTimeLoGain(Byte_t *firstused, Float_t &time, Float_t &dtime, 22 Byte_t &sat, const MPedestalPix &ped) const; 23 24 public: 25 26 MExtractTime(const char *name=NULL, const char *title=NULL); 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): Markus Gaug, 04/2004 <mailto:markus@ifae.es> 19 ! 20 ! Copyright: MAGIC Software Development, 2000-2004 21 ! 22 ! 23 \* ======================================================================== */ 24 25 ////////////////////////////////////////////////////////////////////////////// 26 // 27 // MExtractTime 28 // 29 // Base class for the signal extractors, used the functions 30 // FindTimeHiGain() and FindTimeLoGain() to extract the signal and 31 // substract the pedestal value 32 // 33 // The following variables have to be set by the derived class and 34 // do not have defaults: 35 // - fNumHiGainSamples 36 // - fNumLoGainSamples 37 // - fSqrtHiGainSamples 38 // - fSqrtLoGainSamples 39 // 40 // Input Containers: 41 // MRawEvtData 42 // MRawRunHeader 43 // MPedestalCam 44 // 45 // Output Containers: 46 // MArrivalTimeCam 47 // 48 ////////////////////////////////////////////////////////////////////////////// 49 #include "MExtractTime.h" 50 51 #include <fstream> 52 53 #include "MLog.h" 54 #include "MLogManip.h" 55 56 #include "MParList.h" 57 58 #include "MRawEvtData.h" 59 #include "MRawEvtPixelIter.h" 60 #include "MRawRunHeader.h" 61 62 #include "MPedestalCam.h" 63 #include "MPedestalPix.h" 64 65 #include "MArrivalTimeCam.h" 66 #include "MArrivalTimePix.h" 67 68 ClassImp(MExtractTime); 69 70 using namespace std; 71 72 // -------------------------------------------------------------------------- 73 // 74 // Default constructor. 75 // 76 // Set: 77 // - all pointers to NULL 78 // - all variables to 0 79 // - fSaturationLimit to fgSaturationLimit 80 // 81 // Call: 82 // - AddToBranchList("MRawEvtData.*") 83 // 84 MExtractTime::MExtractTime(const char *name, const char *title) 85 : fArrTime(NULL) 86 { 87 88 fName = name ? name : "MExtractTime"; 89 fTitle = title ? title : "Base class for signal extractors"; 90 91 } 92 93 94 95 // -------------------------------------------------------------------------- 96 // 97 // The PreProcess searches for the following input containers: 98 // - MRawEvtData 99 // - MRawRunHeader 100 // - MPedestalCam 101 // 102 // The following output containers are also searched and created if 103 // they were not found: 104 // 105 // - MArrivalTimeCam 106 // 107 Int_t MExtractTime::PreProcess(MParList *pList) 108 { 109 110 fRawEvt = (MRawEvtData*)pList->FindObject(AddSerialNumber("MRawEvtData")); 111 if (!fRawEvt) 112 { 113 *fLog << err << AddSerialNumber("MRawEvtData") << " not found... aborting." << endl; 114 return kFALSE; 115 } 116 117 fRunHeader = (MRawRunHeader*)pList->FindObject(AddSerialNumber("MRawRunHeader")); 118 if (!fRunHeader) 119 { 120 *fLog << err << AddSerialNumber("MRawRunHeader") << " not found... aborting." << endl; 121 return kFALSE; 122 } 123 124 125 fArrTime = (MArrivalTimeCam*)pList->FindCreateObj(AddSerialNumber("MArrivalTimeCam")); 126 if (!fArrTime) 127 return kFALSE; 128 129 130 fPedestals = (MPedestalCam*)pList->FindObject(AddSerialNumber("MPedestalCam")); 131 if (!fPedestals) 132 { 133 *fLog << err << AddSerialNumber("MPedestalCam") << " not found... aborting" << endl; 134 return kFALSE; 135 } 136 137 return kTRUE; 138 } 139 140 // -------------------------------------------------------------------------- 141 // 142 // The ReInit searches for: 143 // - MRawRunHeader::GetNumSamplesHiGain() 144 // - MRawRunHeader::GetNumSamplesLoGain() 145 // 146 // In case that the variable fLoGainLast is smaller than 147 // the even part of the number of samples obtained from the run header, a 148 // warning is given an the range is set back accordingly. A call to: 149 // - SetRange(fHiGainFirst, fHiGainLast, fLoGainFirst, fLoGainLast-diff) 150 // is performed in that case. The variable diff means here the difference 151 // between the requested range (fLoGainLast) and the available one. Note that 152 // the functions SetRange() are mostly overloaded and perform more checks, 153 // modifying the ranges again, if necessary. 154 // 155 // In case that the variable fHiGainLast is smaller than the available range 156 // obtained from the run header, a warning is given that a part of the low-gain 157 // samples are used for the extraction of the high-gain signal. 158 // 159 // Call: 160 // - MArrivalTimeCam::SetUsedFADCSlices(fHiGainFirst, fHiGainLast, fNumHiGainSamples, 161 // fLoGainFirst, fLoGainLast, fNumLoGainSamples); 162 // 163 Bool_t MExtractTime::ReInit(MParList *pList) 164 { 165 166 Int_t lastdesired = (Int_t)(fLoGainLast); 167 Int_t lastavailable = (Int_t)fRunHeader->GetNumSamplesLoGain()-1; 168 169 if (lastdesired > lastavailable) 170 { 171 const Int_t diff = lastdesired - lastavailable; 172 *fLog << endl; 173 *fLog << warn << GetDescriptor() 174 << Form("%s%2i%s%2i%s%2i%s",": Selected Lo Gain FADC Window [", 175 (int)fLoGainFirst,",",lastdesired, 176 "] ranges out of the available limits: [0,",lastavailable,"].") << endl; 177 *fLog << GetDescriptor() << ": Will reduce the upper edge to " << (int)(fLoGainLast - diff) << endl; 178 SetRange(fHiGainFirst, fHiGainLast, fLoGainFirst, fLoGainLast-diff); 179 } 180 181 lastdesired = (Int_t)fHiGainLast; 182 lastavailable = (Int_t)fRunHeader->GetNumSamplesHiGain()-1; 183 184 if (lastdesired > lastavailable) 185 { 186 const Int_t diff = lastdesired - lastavailable; 187 *fLog << endl; 188 *fLog << warn << GetDescriptor() 189 << Form("%s%2i%s%2i%s%2i%s",": Selected Hi Gain FADC Window [", 190 (int)fHiGainFirst,",",lastdesired, 191 "] ranges out of the available limits: [0,",lastavailable,"].") << endl; 192 *fLog << warn << GetDescriptor() 193 << Form("%s%2i%s",": Will use ",diff," samples from the Low-Gain for the High-Gain extraction") 194 << endl; 195 fHiGainLast -= diff; 196 fHiLoLast = diff; 197 } 198 199 200 fArrTime->SetUsedFADCSlices(fHiGainFirst, fHiGainLast+fHiLoLast, fLoGainFirst, fLoGainLast); 201 202 return kTRUE; 203 } 204 205 206 207 void MExtractTime::FindTimeHiGain(Byte_t *firstused, Float_t &time, Float_t &dtime, 208 Byte_t &sat, const MPedestalPix &ped) const 209 { 210 return; 211 } 212 213 void MExtractTime::FindTimeLoGain(Byte_t *firstused, Float_t &time, Float_t &dtime, 214 Byte_t &sat, const MPedestalPix &ped) const 215 { 216 return; 217 } 218 219 // -------------------------------------------------------------------------- 220 // 221 // Calculate the integral of the FADC time slices and store them as a new 222 // pixel in the MArrivalTimeCam container. 223 // 224 Int_t MExtractTime::Process() 225 { 226 227 228 MRawEvtPixelIter pixel(fRawEvt); 229 fArrTime->Clear(); 230 231 while (pixel.Next()) 232 { 233 // 234 // Find signal in hi- and lo-gain 235 // 236 Float_t timehi=0., deltatimehi=0.; 237 Byte_t sathi=0; 238 239 const Int_t pixid = pixel.GetPixelId(); 240 const MPedestalPix &ped = (*fPedestals)[pixid]; 241 MArrivalTimePix &pix = (*fArrTime)[pixid]; 242 243 FindTimeHiGain(pixel.GetHiGainSamples()+fHiGainFirst, timehi, deltatimehi, sathi, ped); 244 245 Float_t timelo=0., deltatimelo=0.; 246 Byte_t satlo=0; 247 248 if (pixel.HasLoGain()) 249 FindTimeLoGain(pixel.GetLoGainSamples()+fLoGainFirst, timelo, deltatimelo, satlo, ped); 250 251 pix.SetArrivalTime(timehi, deltatimehi, timelo, deltatimelo); 252 pix.SetGainSaturation(sathi, sathi, satlo); 27 253 28 ClassDef(MExtractTime, 0) // Arrival Time Extractor Base Class29 }; 30 31 #endif 32 33 34 254 } /* while (pixel.Next()) */ 255 256 fArrTime->SetReadyToSave(); 257 258 return kTRUE; 259 } 260
Note:
See TracChangeset
for help on using the changeset viewer.