9 #include "QDetChannelCollectionHandle.hh"
22 using namespace Diana;
26 fCoincidenceDataOwner = GetString(
"CoincidenceDataOwner",
"Coincidence");
27 fOutput = GetString(
"Output",
"jitter.txt");
31 fJitterByDelaySource = GetString(
"JitterByDelaySource",
Q_STRING_DEFAULT,
false);
33 Info(
"Tower is: %d", fTower);
36 Info(
"Reference Channel set to: %d", fRefCh);
40 fEnergyLabel = GetString(
"EnergyLabel",
"ApplyCalibration@Energy");
67 QDetChannelCollectionHandle dccHandle;
68 dccHandle.SetRun(fRun);
69 GlobalData().Get(
"",&dccHandle,
"");
70 const QDetChannelCollection& DCC = dccHandle.Get();
71 const std::vector<int>& boloRelChan = DCC.GetRelativeChannels(
channel);
73 if(
cd.fMultiplicity==2) {
75 const int o_channel =
cd.fCoincidentChannels[0].fChannelId;
78 const int deltaTower =
cd.fCoincidentChannels[0].fDeltaTower;
79 const int deltaFloor =
cd.fCoincidentChannels[0].fDeltaFloor;
80 const int deltaPos =
cd.fCoincidentChannels[0].fDeltaPosition;
83 if (find(boloRelChan.begin(),boloRelChan.end(),o_channel)==boloRelChan.end()
87 && ((
abs(deltaFloor)==1 && deltaPos==0)
90 const double deltaT =
cd.fCoincidentChannels[0].fDeltaT;
92 fDeltaT[
channel][o_channel].push_back(deltaT);
101 GlobalHandle<QInt> dHandle(
"Dataset");
102 GlobalData().Get(
"",&dHandle,
"");
103 fDataset = dHandle.Get();
105 QDetChannelCollectionHandle dccHandle;
106 dccHandle.SetRun(fRun);
107 GlobalData().Get(
"",&dccHandle,
"");
108 const QDetChannelCollection& DCC = dccHandle.Get();
111 QVector vecDeltaT_red;
114 double DeltaTRMS = 0.;
116 std::map<int,std::map<int,std::vector<double> > >::const_iterator iter;
117 std::map<int,std::vector<double> > ::const_iterator mapIter;
122 iter = fDeltaT.begin();
123 while(iter != fDeltaT.end()) {
124 int ch = iter->first;
125 mapIter = (iter->second).begin();
126 while(mapIter != (iter->second).end()) {
127 int o_ch = mapIter->first;
128 if(fDeltaT[ch][o_ch].size()>0) {
129 vecDeltaT.Resize(fDeltaT[ch][o_ch].size());
130 vecDeltaT_red.Resize(0);
131 for (
size_t i=0; i<vecDeltaT.Size(); i++) {
132 vecDeltaT[i] = (fDeltaT[ch][o_ch])[i];
134 double medianDeltaT = vecDeltaT.GetMedian();
135 double MADDeltaT = vecDeltaT.GetMedianAbsoluteDeviation();
136 for (
size_t j=0; j<vecDeltaT.Size(); j++) {
137 if(vecDeltaT[j]>(medianDeltaT-3.*MADDeltaT) && vecDeltaT[j]<(medianDeltaT+3.*MADDeltaT)) {
138 vecDeltaT_red.Append(vecDeltaT[j]);
141 if(vecDeltaT_red.Size()>0) {
142 DeltaT = vecDeltaT_red.Sum(vecDeltaT_red.Size(),0)/vecDeltaT_red.Size();
143 DeltaTRMS = vecDeltaT_red.GetRMS(vecDeltaT_red.Size())/sqrt(vecDeltaT_red.Size());
144 fJitter[ch][o_ch] = DeltaT;
145 fJitterRMS[ch][o_ch] = DeltaTRMS;
147 std::cout<< ch <<
" " << o_ch <<
" "<<fJitter[ch][o_ch]<<
" "<< fJitterRMS[ch][o_ch] << std::endl;
157 const std::vector<int>& towers = DCC.GetTowers();
160 for (
size_t j=0; j<towers.size(); j++) {
161 int tower = towers[j];
162 const std::vector<int>& floors = DCC.GetFloorsInTower(tower);
166 Info(
"Processing tower: %d",tower);
169 Info(
"Skip tower %d",tower);
171 }
else if (floors.size()==0) {
173 Info(
"Tower %d has no floors",tower);
177 int last_floor = floors[floors.size()-1];
188 while (!fRefCh_IsSet) {
189 fRefCh = FindChanWithPosInTowerFloor(position,tower,flfl);
190 std::map<int,std::map<int,double > >::const_iterator riter = fJitter.find(fRefCh);
191 if (riter!=fJitter.end()) {
195 GlobalData().Get(
"JitterByDelay",&jdHandle,fJitterByDelaySource);
197 if(jdHandle.IsValid()) {
200 Warn(
"Channel %d, has no jitter by delay: %s",fRefCh,jdHandle.GetError().GetDescription().c_str());
201 position = position+1;
207 position = position+1;
210 Warn(
"Tower %d has no valid reference channels in floor 1",tower);
214 if( flfl > last_floor )
215 Panic(
"Tower %d has no valid reference channels anywhere", tower);
217 Info(
"Reference Channel set to: %d", fRefCh);
219 position = DCC.Get(fRefCh).fTd.fTdPos;
222 for (
size_t i=0; i<floors.size(); i++) {
223 int floor = floors[i];
224 if (floor == last_floor)
230 Info(
"Processing floor: %d, position: %d",floor,position);
231 position = ProcessFloor(position,tower,floor);
241 std::map<int,std::map<int,double > >::const_iterator miter = fJitter.find(ch);
242 if (miter!=fJitter.end()) jitter = fJitter[ch][o_ch];
246 std::map<int,std::map<int,double > >::const_iterator miter = fJitter.find(o_ch);
247 if (miter != fJitter.end()) {
248 std::map<int,double>::const_iterator viter = (miter->second).find(ch);
249 if (viter != (miter->second).end()) jitter = -fJitter[o_ch][ch];
257 double jitterRMS = 0.;
260 std::map<int,std::map<int,double > >::const_iterator miter = fJitterRMS.find(ch);
261 if (miter!=fJitterRMS.end()) jitterRMS = fJitterRMS[ch][o_ch];
265 std::map<int,std::map<int,double > >::const_iterator miter = fJitterRMS.find(o_ch);
266 if (miter != fJitterRMS.end()) {
267 std::map<int,double>::const_iterator viter = (miter->second).find(ch);
268 if (viter != (miter->second).end()) jitterRMS = fJitterRMS[o_ch][ch];
277 std::vector<int> chans;
279 QDetChannelCollectionHandle dccHandle;
280 dccHandle.SetRun(fRun);
281 GlobalData().Get(
"",&dccHandle,
"");
282 const QDetChannelCollection& DCC = dccHandle.Get();
284 const std::vector<int>& chTF = DCC.GetChannelsInTowerFloor(tower,floor);
286 for (
size_t i=0; i<chTF.size(); i++)
288 if (DCC.Get(chTF[i]).fTd.fTdPos == pos) chans.push_back(chTF[i]);
291 for (
size_t j=0; j<chans.size(); j++)
293 if (fGoodChannels.count(chans[j])>0) chan = chans[j];
312 GlobalHandle<QString> clabelh(
"CalibrationLabel");
313 clabelh.SetDataset(fDataset);
314 clabelh.SetChannel(ch);
315 GlobalData().Get(fEnergyLabel.owner,&clabelh,
"CurrentReader");
316 if(clabelh.IsValid()) {
322 jitterHandle.Set(jitterObj);
323 GlobalData().Set(&jitterHandle,fOutput);
332 int ch_pos_next_floor[ndet];
334 double best_jitter = 0.;
335 double best_jitterRMS = 0.;
337 for (
int i=0; i<ndet; i++)
339 pos[i] = start_pos+i;
340 if (pos[i]>4) pos[i]=pos[i]-4;
342 ch_pos[i] = FindChanWithPosInTowerFloor(pos[i],tower,floor);
343 ch_pos_next_floor[i] = FindChanWithPosInTowerFloor(pos[i],tower,floor+1);
345 double temp_jitterRMS = FindJitterRMS(ch_pos_next_floor[i],ch_pos[i]);
346 if (temp_jitterRMS>0.) best_jitterRMS = temp_jitterRMS;
351 for (
int i=0; i<ndet; i++)
353 double floor_jitterRMS = FindJitterRMS(ch_pos_next_floor[i],ch_pos[i]);
354 double floor_jitter = FindJitter(ch_pos_next_floor[i],ch_pos[i]);
356 if(floor_jitterRMS!=0 && floor_jitterRMS<=best_jitterRMS)
358 best_jitterRMS = floor_jitterRMS;
359 best_jitter = floor_jitter;
367 double jitter_rel[ndet];
368 double jitterRMS_rel[ndet];
370 double jitter11,jitter21,jitter41,jitter32,jitter34,jitter31;
371 double jitter11RMS,jitter21RMS,jitter41RMS,jitter32RMS,jitter34RMS,jitter31RMS;
372 double error321, error341;
374 jitter11 = FindJitter(ch_pos[0],ch_pos[0]);
375 jitter11RMS = FindJitterRMS(ch_pos[0],ch_pos[0]);
377 jitter21 = FindJitter(ch_pos[1],ch_pos[0]);
378 jitter21RMS = FindJitterRMS(ch_pos[1],ch_pos[0]);
380 jitter41 = FindJitter(ch_pos[3],ch_pos[0]);
381 jitter41RMS = FindJitterRMS(ch_pos[3],ch_pos[0]);
383 jitter32 = FindJitter(ch_pos[2],ch_pos[1]);
384 jitter32RMS = FindJitterRMS(ch_pos[2],ch_pos[1]);
386 jitter34 = FindJitter(ch_pos[2],ch_pos[3]);
387 jitter34RMS = FindJitterRMS(ch_pos[2],ch_pos[3]);
389 jitter31 = FindJitter(ch_pos[2],ch_pos[0]);
390 jitter31RMS = FindJitterRMS(ch_pos[2],ch_pos[0]);
392 if (jitter32RMS!=0. && jitter21RMS!=0.) {error321 = sqrt(
pow(jitter32RMS,2)+
pow(jitter21RMS,2));}
393 else error321 = 9999.;
394 if (jitter34RMS!=0. && jitter41RMS!=0.) {error341 = sqrt(
pow(jitter34RMS,2)+
pow(jitter41RMS,2));}
395 else error341 = 9999.;
399 if (error321<error341) {
400 jitter_rel[2] = fJitterSum + jitter32 + jitter21;
401 jitterRMS_rel[2] = fJitterErrorSum +
pow(error321,2);
403 SaveJitter(ch_pos[2],jitter_rel[2],sqrt(jitterRMS_rel[2]));
405 else if (error341<error321) {
406 jitter_rel[2] = fJitterSum + jitter34 + jitter41;
407 jitterRMS_rel[2] = fJitterErrorSum +
pow(error341,2);
409 SaveJitter(ch_pos[2],jitter_rel[2],sqrt(jitterRMS_rel[2]));
413 jitter_rel[2] = fJitterSum + jitter31;
414 jitterRMS_rel[2] = fJitterErrorSum +
pow(jitter31RMS,2);
416 SaveJitter(ch_pos[2],jitter_rel[2],sqrt(jitterRMS_rel[2]));
422 jitter_rel[1] = fJitterSum + jitter21;
423 jitterRMS_rel[1] = fJitterErrorSum +
pow(jitter21RMS,2);
425 SaveJitter(ch_pos[1],jitter_rel[1],sqrt(jitterRMS_rel[1]));
430 jitter_rel[3] = fJitterSum + jitter41;
431 jitterRMS_rel[3] = fJitterErrorSum +
pow(jitter41RMS,2);
433 SaveJitter(ch_pos[3],jitter_rel[3],sqrt(jitterRMS_rel[3]));
437 jitter_rel[0] = fJitterSum + jitter11;
438 jitterRMS_rel[0] = fJitterErrorSum +
pow(jitter11RMS,2);
440 SaveJitter(ch_pos[0],jitter_rel[0],sqrt(jitterRMS_rel[0]));
447 if (best_pos!=start_pos)
450 if (best_pos>start_pos){
451 ch = best_pos - start_pos;
453 if (best_pos<start_pos){
454 ch = 4 - (start_pos - best_pos);
457 fJitterSum = jitter_rel[ch] + best_jitter;
458 fJitterErrorSum = fJitterErrorSum +
pow(jitterRMS_rel[ch],2) +
pow(best_jitterRMS,2);
462 fJitterSum = fJitterSum + best_jitter;
463 fJitterErrorSum = fJitterErrorSum +
pow(best_jitterRMS,2);
Diana::QComplex pow(const Diana::QComplex &z, double a)
Raise a complex number to a real power.
#define REGISTER_MODULE(clazz)
Diana::QVector abs(const Diana::QVector &v)
Calculates time jitter between couples of channels using coincident events.
double FindJitter(int ch, int o_ch)
FindJitter function.
double FindJitterRMS(int ch, int o_ch)
FindJitterRMS function.
void Init(Diana::QEvent &ev)
Init method.
void Do(Diana::QEvent &ev)
Do method
void SaveJitter(int ch, double jitter, double jitter_error)
SaveJitter function.
int FindChanWithPosInTowerFloor(int pos, int tower, int floor)
FindPos function.
int ProcessFloor(int pos, int tower, int floor)
ProcessFloor function.
base types wrapped into a QObject. Currently implemented types are QInt QDouble and QFloat....
void RequireByLabel(const QEventLabel &label) const
notify the QEvent that we need a QObject, if not found an exception is thrown
void Require(const std::string &owner, const std::string &name) const
notify the QEvent that we need a QObject, if not found an exception is thrown
void Get(const char *owner, ReadHandle< Q > &handle) const
Get a QObject Handle in read mode.
global handle for jitter by coincidence
void SetCalibLabel(const std::string &calibl)
void SetCalibVersion(const std::string &calibv)
Raw event: bolometer channel, trigger positions and types.
const int & GetChannelId() const
Get ChannelId.
the Diana namespace is needed because sometimes we use Qt libraries, that use same class names of our...