/// merge N events into 1. /// to compile: g++ convert.cpp -O3 -Icode/Common -o convert /// to run: convert NMergeEvents NGeneratedEvents OutputDir InputDir. If you want merge 20 events into 10, then print: convert 2 10 #define DEBUG #define MUTE1 #define MUTE2 #include #include #include #include #include #include // for atoi #include #include "TRandom.h" using namespace std; typedef float fscal; // #include "code/Algo/L1Algo/L1Types.h" #include "code/Performance/CbmL1MCPoint.h" #include "code/L1Algo/L1StsHit.h" #include "code/L1Algo/L1Strip.h" #include "code/Performance/CbmL1StsHit.h" #include "code/Performance/CbmL1MCTrack.h" char work_dir[100] = "/d/cbm05/akishina/STAP/centr_25_1e/"; // path to input and output files //char work_dir[100] = "/d/cbm05/akishina/STAP/mbias_1k/"; //char work_dir[100] = "/d/cbm02/ikulakov/STAP/centr_0maps_015deg_100ev_MCInOut_13032012/"; // path to input and output files //char work_dir[100] = "/d/cbm02/ikulakov/STAP/mbias_1000ev_25022010/"; // path to input and output files // char work_dir[100] = "/u/ikulakov/STAP/data/centr_100ev_07042009/"; // path to input and output files //char out_dir[100] = "/d/cbm05/akishina/STAP/mbias_0maps_015deg_1000ev_13032012_30e_30g_new_track/"; char out_dir[100] = "/d/cbm05/akishina/STAP/centr_25_convert_1event/"; const int NStations = 8; float EventRate = 1e7f; float tau = 1.e9f/EventRate; // average time between events in [ns] float T0 = 0.f; float T0_shift = 0.f; class CbmL1HitStore{ public: int ExtIndex; int iStation; double x, y; // bool operator>(CbmL1HitStore& a1) { return a1.y > y;} int IsLessThan(CbmL1HitStore& a1){ if (a1.y > y) return 1; if (a1.y == y) return 0; return -1; } }; struct TData{ TData() { for(int i=0; i<20; i++) {StsHitsStartIndex[i]=-1; StsHitsStopIndex[i]=0;}} vector< L1Strip > vStsStrips, vStsStripsB; vector< L1StsHit > vStsHits; vector< unsigned char > vSFlag; // = iStation*4 + used*2 + used_by_duplets; vector< unsigned char > vSFlagB; int StsHitsStartIndex[20], StsHitsStopIndex[20]; vector vMCPoints; // list of MonteCarlo(=simulated) point vector vMCTracks; // list of MonteCarlo(=simulated) track vector vHitMCRef; // index the registred(effective(reference??)) MonteCarlo points(=hits) in vMCPoints vector vHitStore; // array of all hits. all hits must have corespondend point, which marked in vHitMCRef vector vStsHitsPerfo; vector< fscal > vStsZPos; const THitI* StsHitsStartIndex_; const THitI* StsHitsStopIndex_; void Add(TData& data_new, int iEv); int Correct(); // TData& operator= (TData& a){ // vStsStrips = a.vStsStrips; // vStsStripsB = a.vStsStripsB; // vStsHits = a.vStsHits; // vSFlag = a.vSFlag; // vSFlagB = a.vSFlagB; // // for (int i = 0; i < 20; i++){ // StsHitsStartIndex[i] = a.StsHitsStartIndex[i]; // StsHitsStopIndex[i] = a.StsHitsStopIndex[i]; // }; // // vMCPoints = a.vMCPoints; // vMCTracks = a.vMCTracks; // vHitMCRef = a.vHitMCRef; // vHitStore = a.vHitStore; // }; void Reserve(int nEv); }; void TData::Reserve(int nEv) { const int k = 1.2*nEv; #define res(AAAA) AAAA.reserve(AAAA.size()*k) res(vStsStrips); res(vStsStripsB); res(vStsHits); res(vSFlag); res(vSFlagB); res(vMCPoints); res(vMCTracks); res(vHitMCRef); res(vHitStore); res(vStsHitsPerfo); #undef res } int TData::Correct() { int flag = 1; // int curStart = -1, curStop = 0; // for (int i = 0; i < NStations; i++){ //#ifdef DEBUG // cout << i << " : " << " " << StsHitsStartIndex[i] << endl; // cout << i << " : " << " " << StsHitsStopIndex[i] << endl; //#endif // if (curStart > StsHitsStartIndex[i]){ //#ifdef DEBUG // cout << " : StsHitsStartIndex " << StsHitsStartIndex[i] << " -> "; // StsHitsStartIndex[i] = curStart; // cout << StsHitsStartIndex[i] << endl; //#else // StsHitsStartIndex[i] = curStart; //#endif // flag = 0; // } // else curStart = StsHitsStartIndex[i]; // if (curStart > StsHitsStopIndex[i]){ //#ifdef DEBUG // cout << " : StsHitsStopIndex " << StsHitsStopIndex[i] << " -> "; // StsHitsStopIndex[i] = curStart-1; // cout << StsHitsStopIndex[i] << endl; //#else // StsHitsStopIndex[i] = curStart-1; //#endif // flag = 0; // } // else curStart = StsHitsStopIndex[i]; // }; int curStart = 0; for(int i = 0; i vStsZPos_old; #ifndef MUTE0 cout << data_new.vStsStrips.size()+data_new.vStsStripsB.size() << " strips and "; cout << data_new.vStsHits.size() << " hits for "; cout << data_new.vMCTracks.size() << " tracks "; cout << " will be added." << endl; #endif for (unsigned int i = 0; i < data_new.vStsStrips.size(); i++) vStsStrips.push_back(L1Strip(data_new.vStsStrips[i], iEv)); for (unsigned int i = 0; i < data_new.vStsStripsB.size(); i++) vStsStripsB.push_back(L1Strip(data_new.vStsStripsB[i], iEv)); for (unsigned int i = 0; i < data_new.vSFlag.size(); i++) vSFlag.push_back(data_new.vSFlag[i]); for (unsigned int i = 0; i < data_new.vSFlagB.size(); i++) vSFlagB.push_back(data_new.vSFlagB[i]); vStsZPos_old.resize(vStsZPos.size()); for (unsigned int i = 0; i < vStsZPos.size(); i++) vStsZPos_old[i] = vStsZPos[i]; for (unsigned int i = 0; i < data_new.vStsZPos.size(); i++) { // cout<=0); } for (unsigned int i = 0; i < data_new.vStsHitsPerfo.size(); i++){ CbmL1StsHit &p = data_new.vStsHitsPerfo[i]; //p.hitId = hitMoveMap_new[p.hitId]; for (unsigned int j = 0; j < p.mcPointIds.size(); j++){ p.mcPointIds[j] += mcPointsSize;//StsPerfoMoveMap[p.mcPointIds[j]]; } // vStsHitsPerfo.push_back(p); } vector hitMoveMap(vHitStore.size()), hitMoveMap_new(data_new.vHitStore.size()); for (unsigned int i = 0; i < vHitStore.size(); i++){ hitMoveMap[i] = i; } vector vHitStore_cmb(vHitStore.size()+data_new.vHitStore.size()); vector vHitMCRef_cmb(vHitMCRef.size()+data_new.vHitMCRef.size()); vector vStsHits_cmb(vStsHits.size()+data_new.vStsHits.size()); vector vStsHitsPerfo_cmb(vStsHitsPerfo.size()+data_new.vStsHitsPerfo.size()); for (int iS = 0; iS < NStations; iS++){ int beginH = data_new.StsHitsStartIndex[iS]; int endH = data_new.StsHitsStopIndex[iS]; int beginH2 = StsHitsStartIndex[iS]; int endH2 = StsHitsStopIndex[iS]; // sort in an increasing order int iH = beginH, iH2 = beginH2; for (; (iH < endH) && (iH2 < endH2); ){ L1_ASSERT(data_new.vHitStore[iH].y <= data_new.vHitStore[iH+1].y || iH + 1 >= endH, data_new.vHitStore[iH].y << " " << data_new.vHitStore[iH+1].y << " " << iH << " " << endH); int iHc = iH+iH2; CbmL1HitStore hs = data_new.vHitStore[iH]; CbmL1HitStore hs2 = vHitStore[iH2]; if (hs2.IsLessThan(hs) > 0){ // add hs2 hitMoveMap[iH2] = iHc; vHitStore_cmb[iHc] = hs2; vHitMCRef_cmb[iHc] = vHitMCRef[iH2]; vStsHits_cmb[iHc] = vStsHits[iH2]; vStsHitsPerfo_cmb[iHc] = vStsHitsPerfo[iH2]; iH2++; } else { // add hs hitMoveMap_new[iH] = iHc; vHitStore_cmb[iHc] = hs; vHitMCRef_cmb[iHc] = data_new.vHitMCRef[iH]; vStsHits_cmb[iHc] = data_new.vStsHits[iH]; vStsHitsPerfo_cmb[iHc] = data_new.vStsHitsPerfo[iH]; iH++; } }; // iH // add the rest for (; (iH < endH) || (iH2 < endH2); ){ int iHc = iH+iH2; if (iH2 < endH2){ // add hs2 hitMoveMap[iH2] = iHc; vHitStore_cmb[iHc] = vHitStore[iH2]; vHitMCRef_cmb[iHc] = vHitMCRef[iH2]; vStsHits_cmb[iHc] = vStsHits[iH2]; vStsHitsPerfo_cmb[iHc] = vStsHitsPerfo[iH2]; iH2++; } else { // add hs hitMoveMap_new[iH] = iHc; vHitStore_cmb[iHc] = data_new.vHitStore[iH]; vHitMCRef_cmb[iHc] = data_new.vHitMCRef[iH]; vStsHits_cmb[iHc] = data_new.vStsHits[iH]; vStsHitsPerfo_cmb[iHc] = data_new.vStsHitsPerfo[iH]; iH++; } }; // iH } // iS for (int iS = 0; iS < NStations; iS++){ int beginH = data_new.StsHitsStartIndex[iS]; int endH = data_new.StsHitsStopIndex[iS]; // cout <<(endH2-StsHitsStopIndex[iS])<<" (endH2-StsHitsStopIndex[iS])" <= 0) ) // { // StsHitsStartIndex[iS] = 0; // for(int iS2 = iS + 1; iS2 < NStations; iS2++) // if(StsHitsStartIndex[iS2] == -1) StsHitsStartIndex[iS2] = 0; // } // if(nH>0) { StsHitsStopIndex[iS] += nH; // cout <= 0) t.mother_ID += mcTrackIndexOffset; else t.mother_ID = -iEv-1; for (unsigned int j = 0; j < t.StsHits.size(); j++){ // cout << t.StsHits[j] << " "; t.StsHits[j] = hitMoveMap_new[t.StsHits[j]]; // cout << t.StsHits[j] << endl; } for (unsigned int l = 0; l < t.Points.size(); l++){ t.Points[l] += mcPointsSize; } vMCTracks.push_back(t); } } void ReadStAPAlgoData(TData &data) { #ifndef MUTE0 cout << " ReadStAPAlgoData"<> s; // cout << s<< " s"<> nEv; // cout << nEv<< " nEv"<> kk; int n; // number of elements // read data.vStsStrips fadata >> n; // cout << n<< " vStsStrips"<> element>> element2; // vStsStrips.push_back(L1Strip(element,element2)); fadata >> element; data.vStsStrips.push_back(L1Strip(element)); }; // read data.vStsStripsB fadata >> n; // cout << n<< " vStsStripsB"<> element >> element2; // vStsStripsB.push_back(L1Strip(element,element2)); fadata >> element; data.vStsStripsB.push_back(L1Strip(element)); }; // read data.vSFlag fadata >> n; // cout << n<< " vStsZPos"<> element; // cout<> n; // cout << n<< " vSFlag"<> element; // cout << element<< " vSFlag"<> n; // cout << n<< " vSFlagB"<> element; // cout << element<< " vSFlagB"<> n; // cout << n<< " vStsHits"<> element_f >> element_b >> element_iz >> time; // cout << element_f<< " "<(element_f); element.b = static_cast(element_b); element.iz = static_cast(element_iz); element.t_reco = time; data.vStsHits.push_back(element); } n = 20; int MaxNStations = NStations; for (int i = 0; i < n; i++){ int tmp; fadata >> tmp; if (MaxNStations+1 > i) data.StsHitsStartIndex[i] = tmp; #ifndef MUTE2 cout << tmp<< " tmp"<> tmp; if (MaxNStations+1 > i) data.StsHitsStopIndex[i] = tmp; #ifndef MUTE2 cout << tmp<< " tmp"<> s; fpdata >> nEv; // cout << nEv<< " nEv"<> n; // cout <> element.xIn; fpdata >> element.yIn; fpdata >> element.zIn; fpdata >> element.pxIn; fpdata >> element.pyIn; fpdata >> element.pzIn; fpdata >> element.xOut; fpdata >> element.yOut; fpdata >> element.zOut; fpdata >> element.pxOut; fpdata >> element.pyOut; fpdata >> element.pzOut; element.x = (element.xIn + element.xOut)/2; element.y = (element.yIn + element.yOut)/2; element.z = (element.zIn + element.zOut)/2; element.px = (element.pxIn + element.pxOut)/2; element.py = (element.pyIn + element.pyOut)/2; element.pz = (element.pzIn + element.pzOut)/2; fpdata >> element.p; fpdata >> element.q; fpdata >> element.mass; fpdata >> element.time; fpdata >> element.pdg; fpdata >> element.ID; fpdata >> element.mother_ID; fpdata >> element.iStation; int nPoints; fpdata >> nPoints; for (int k = 0; k < nPoints; k++){ int helement; fpdata >> helement; element.hitIds.push_back(helement); }; data.vMCPoints.push_back(element); }; // vMCTracks . without Points fpdata >> n; // cout << n<<" vMCTracks"<< endl; for (int i = 0; i < n; i++){ CbmL1MCTrack element; fpdata >> element.x; fpdata >> element.y; fpdata >> element.z; fpdata >> element.px; fpdata >> element.py; fpdata >> element.pz; fpdata >> element.p; fpdata >> element.q; fpdata >> element.mass; fpdata >> element.time; fpdata >> element.pdg; fpdata >> element.ID; fpdata >> element.mother_ID; int nhits; fpdata >> nhits; for (int k = 0; k < nhits; k++){ int helement; fpdata >> helement; element.StsHits.push_back(helement); // cout << helement << endl; // gdb 1 }; fpdata >> nhits; for (int k = 0; k < nhits; k++){ int helement; fpdata >> helement; element.Points.push_back(helement); }; // // find the corrspondece between MCPoint MCTrack // // for (unsigned k = 0; k < data.vMCPoints.size(); k++){ // // find track with ID // int itr = 0; // for (;data.vMCTracks[itr].ID != data.vMCPoints[k].ID;itr++); // data.vMCTracks[itr].Points.push_back(&data.vMCPoints[k]); // }; fpdata >> element.nMCContStations; fpdata >> element.nHitContStations; fpdata >> element.maxNStaMC; fpdata >> element.maxNSensorMC; fpdata >> element.maxNStaHits; fpdata >> element.nStations; data.vMCTracks.push_back(element); }; if (iVerbose >= 4) cout << "vMCTracks[" << n << "]" << " have been read." << endl; // vHitMCRef fpdata >> n; #ifndef MUTE2 cout << n<<" vHitMCRef"<< endl; #endif for (int i = 0; i < n; i++){ int element; fpdata >> element; data.vHitMCRef.push_back(element); }; if (iVerbose >= 4) cout << "vHitMCRef[" << n << "]" << " have been read." << endl; // vHitStore fpdata >> n; #ifndef MUTE2 cout << n<<" vHitStore"<< endl; #endif for (int i = 0; i < n; i++){ CbmL1HitStore element; fpdata >> element.ExtIndex; fpdata >> element.iStation; fpdata >> element.x; fpdata >> element.y; data.vHitStore.push_back(element); }; if (iVerbose >= 4) cout << "vHitStore[" << n << "]" << " have been read." << endl; // vStsHits fpdata >> n; #ifndef MUTE2 cout << n<<" vStsHits"<< endl; #endif for (int i = 0; i < n; i++){ CbmL1StsHit element; fpdata >> element.hitId; fpdata >> element.extIndex; int nPoints; fpdata >> nPoints; element.mcPointIds.clear(); for (int k = 0; k < nPoints; k++){ int id; fpdata >> id; element.mcPointIds.push_back(id); }; data.vStsHitsPerfo.push_back(element); }; if (iVerbose >= 4) cout << "vStsHits[" << n << "]" << " have been read." << endl; #ifndef MUTE1 cout << " -I- Performance: data read from file " << fname << " successfully"<< endl; #endif } iEvent++; } // Performance::ReadOneEvData() void WriteStAPAlgoData(TData &data_out) // must be called after ReadEvent { #ifndef MUTE0 cout << " WriteStAPAlgoData"< i) )) stat_sf++; // cout << " Hit sort fault. " << " "; // cout << data_out.StsHitsStartIndex[data_out.vHitStore[i].iStation] << " " << i << " " << data_out.StsHitsStopIndex[data_out.vHitStore[i].iStation] << " " << endl; }; #ifndef MUTE1 cout << data_out.vHitStore.size()<< " vHitStore.size("<SetSeed(1); int NMergeEvents = 2; int NEvents = 1; if (argc >= 2){ NMergeEvents = atoi(argv[1]); } if (argc >= 3){ NEvents = atoi(argv[2]); } if (argc >= 4){ strcpy(out_dir,argv[3]); } if (argc >= 5){ strcpy(work_dir,argv[4]); } std::cout << " Create " << NEvents << " groups of events. " << NMergeEvents << " events in group " << std::endl; std::cout << " Output Dir = " << out_dir << std::endl; std::cout << " Input Dir = " << work_dir << std::endl; // skip // for (int igEv = 0; igEv < 15; igEv++ ){ // TData data; // ReadStAPAlgoData(data); // ReadStAPPerfoData(data); // } for (int igEv = 0; igEv < NEvents; igEv++ ){ T0 = 0; TData data; TData data_out; ReadStAPAlgoData(data); //find shift for timecalculations to avoid negative time values T0_shift = 1.e8f; if(data.vStsHits.size() == 0) T0_shift = 0.f; for(int iHit=0; iHitExp(tau); T0 += deltaT; ReadStAPAlgoData(data); // for (int iS = 0; iS < NStations; iS++ ) // cout<< data_out.StsHitsStartIndex[iS]<<" Algo data_out.StsHitsStartIndex[iS] "<< data_out.StsHitsStopIndex[iS]<< " data_out.StsHitsStopIndex[iS]"<