BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
OfflineRevise.cxx
Go to the documentation of this file.
1#include "RawDataCnv/OfflineRevise.h"
2#include "RawDataCnv/SniperJSON.h"
3#include <fstream>
4#include <iostream>
5
6OfflineRevise::OfflineRevise( const SniperJSON& json ) : m_lastRun( -1 ), m_lastFlag( true ) {
7 const SniperJSON& c1 = json["Ets1MissingSecond"];
8 for ( SniperJSON::vec_iterator it = c1["RunRanges"].vec_begin();
9 it != c1["RunRanges"].vec_end(); ++it )
10 {
11 m_runRanges.push_back(
12 std::make_pair( ( *it )["From"].get<int>(), ( *it )["To"].get<int>() ) );
13 }
14
15 m_runs = c1["Runs"].get<std::vector<int>>();
16
17 // for ( std::vector<std::pair<int, int> >::iterator it = m_runRanges.begin();
18 // it != m_runRanges.end(); ++it) {
19 // std::cout << "RunRange: " << it->first << ", " << it->second << std::endl;
20 // }
21 // for (std::vector<int>::iterator it = m_runs.begin();
22 // it != m_runs.end(); ++it) {
23 // std::cout << "Run: " << *it << std::endl;
24 // }
25
26 m_tRoundSwitch = json["TimeRoundSwitch"].get<int>();
27}
28
30
32 bool goodFlag = true;
33 int run = header->runNumber();
34
35 if ( run == m_lastRun ) { goodFlag = m_lastFlag; }
36 else
37 {
38 for ( std::vector<std::pair<int, int>>::iterator it = m_runRanges.begin();
39 it != m_runRanges.end(); ++it )
40 {
41 if ( run >= it->first && run <= it->second )
42 {
43 goodFlag = false;
44 break;
45 }
46 }
47
48 if ( goodFlag && std::find( m_runs.begin(), m_runs.end(), run ) != m_runs.end() )
49 { goodFlag = false; }
50
51 m_lastFlag = goodFlag;
52 m_lastRun = run;
53 m_lastEvent = header->eventNumber();
54 m_t0Sec = header->time();
55 m_t0NanoShift0 = -1;
56 m_t0NanoShift1 = -1;
57 m_lastEts1 = 0;
58 m_lastEts2Old = 0;
59 m_lastEts2New = 0;
60 }
61
62 if ( !goodFlag )
63 {
64 fixEts1( header );
65 fixEts2( header );
66 }
67}
68
69void OfflineRevise::fixEts1( Event::EventHeader* header ) {
70 long tNow = header->time() - m_t0Sec;
71 unsigned long _ets1 = header->etsT1();
72 long ets1NanoSec = _ets1 % 2000000;
73
74 if ( tNow == 0 )
75 {
76 long _shift0 = ets1NanoSec % 2000000;
77 if ( _shift0 > m_t0NanoShift0 ) { m_t0NanoShift0 = _shift0; }
78 }
79 else if ( tNow == 1 )
80 {
81 if ( m_t0NanoShift1 == -1 )
82 {
83 if ( ets1NanoSec > m_t0NanoShift0 )
84 {
85 m_t0NanoShift1 = ets1NanoSec;
86 // std::cout << "Shift " << m_t0NanoShift0 << " " << m_t0NanoShift1 << std::endl;
87 }
88 }
89 }
90
91 if ( m_t0NanoShift1 > 0 && ets1NanoSec >= m_t0NanoShift1 ) { --tNow; }
92
93 unsigned long ets1 = tNow * 2000000 + ets1NanoSec;
94
95 int evtDiff = header->eventNumber() - m_lastEvent;
96
97 if ( labs( ets1 - m_lastEts1 ) < 1000000 && abs( evtDiff ) < 100 )
98 {
99 // m_lastEts1 = ets1;
100 }
101 else
102 {
103 if ( ets1NanoSec > m_t0NanoShift0 - 200000 )
104 {
105 long tDiff = ets1NanoSec - m_lastEts1 % 2000000;
106 if ( tDiff > 1000000 )
107 {
108 if ( evtDiff < 100 ) { tNow = m_lastEts1 / 2000000 - 1; }
109 }
110 else if ( tDiff < -1000000 )
111 {
112 if ( evtDiff > 100 ) { tNow = m_lastEts1 / 2000000 + 1; }
113 }
114 else { tNow = m_lastEts1 / 2000000; }
115 ets1 = tNow * 2000000 + ets1NanoSec;
116 }
117 }
118
119 header->setEtsT1( ets1 );
120 m_lastEvent = header->eventNumber();
121 if ( abs( evtDiff ) < 100 ) { m_lastEts1 = ets1; }
122}
123
124void OfflineRevise::fixEts2( Event::EventHeader* header ) {
125 unsigned long _ets2 = header->etsT2();
126
127 if ( _ets2 != 0 )
128 {
129 if ( _ets2 == m_lastEts2Old ) { header->setEtsT2( m_lastEts2New ); }
130 else
131 {
132 unsigned long ets1 = header->etsT1();
133 long ets1NanoSec = ets1 % 2000000;
134 long tNow = ets1 / 2000000;
135
136 long ets2NanoSec = _ets2 % 2000000;
137
138 long tDiff = ets2NanoSec - ets1NanoSec;
139 if ( tDiff > 1000000 ) { --tNow; }
140 else if ( tDiff < -1000000 ) { ++tNow; }
141
142 unsigned long ets2 = tNow * 2000000 + ets2NanoSec;
143
144 header->setEtsT2( ets2 );
145 m_lastEts2Old = _ets2;
146 m_lastEts2New = ets2;
147 }
148 }
149}
int eventNumber() const
Retrieve event number.
void setEtsT1(unsigned long value)
Update ETS.
virtual ~OfflineRevise()
OfflineRevise(const SniperJSON &json)
void fixHeader(Event::EventHeader *header)
std::vector< SniperJSON >::const_iterator vec_iterator