Example #1
0
int main(int argc, char *argv[])
{
	assert(argc == 11);
	char *shmObjectPath = argv[1];
	unsigned long dataFrameSharedMemorySize = boost::lexical_cast<unsigned long>(argv[2]);	
	char outputType = argv[3][0];
	char *outputFilePrefix = argv[4];
	float cWindow = boost::lexical_cast<float>(argv[5]);
	float minToT = boost::lexical_cast<float>(argv[6]);
	float preWindow = boost::lexical_cast<float>(argv[7]);
	float postWindow = boost::lexical_cast<float>(argv[8]);
	char *channelMapFileName = argv[9];
	char *triggerMapFileName = argv[10];

	DAQ::Common::SystemInformation *systemInformation = new DAQ::Core::SystemInformation();
	if(cWindow != 0) {
		systemInformation->loadMapFile(channelMapFileName);
		systemInformation->loadTriggerMapFile(triggerMapFileName);
	}
	
	FILE *rawFrameFile = NULL;

	DAQd::SHM *shm = new DAQd::SHM(shmObjectPath);
		
	AbstractRawHitWriter *writer = NULL;
	bool pipeWriterIsNull = true;
	if(outputType == 'T') {
		writer = new TOFPET::RawWriterV3(outputFilePrefix);
		pipeWriterIsNull = false;
	}
	else if(outputType == 'E') {
		writer = new ENDOTOFPET::RawWriterE(outputFilePrefix, 0);
		pipeWriterIsNull = false;
	}
	else if(outputType == 'R') {
		writer = new NullRawHitWriter();

		char fName[1024];
		sprintf(fName, "%s.rawf", outputFilePrefix);
		rawFrameFile = fopen(fName, "wb");
		assert(rawFrameFile != NULL);
		pipeWriterIsNull = true;
	}
	else {
		writer = new NullRawHitWriter();
		pipeWriterIsNull = true;
	}


	bool firstBlock = true;
	float step1;
	float step2;
	BlockHeader blockHeader;
	
	long long stepGoodFrames = 0;
	long long stepEvents = 0;
	long long stepMaxFrame = 0;
	long long stepLostFrames = 0;
	long long stepLostFrames0 = 0;
	
	EventSink<RawHit> *sink = NULL;
	EventBuffer<RawHit> *outBuffer = NULL;
	long long minFrameID = 0x7FFFFFFFFFFFFFFFLL, maxFrameID = 0, lastMaxFrameID = 0;
	
	long long lastFrameID = -1;
	long long stepFirstFrameID = -1;

	while(fread(&blockHeader, sizeof(blockHeader), 1, stdin) == 1) {

		step1 = blockHeader.step1;
		step2 = blockHeader.step2;
		
		if(sink == NULL) {
			writer->openStep(step1, step2);
			if (pipeWriterIsNull) {
				sink = new NullSink<RawHit>();
			}
			else if (cWindow == 0) {
				sink =	new CoarseSorter(
					new RawHitWriterHandler(writer,
					new NullSink<RawHit>()
					));
			}
			else {
				// Round up cWindow and minToT for use in CoincidenceFilter
				float cWindowCoarse = (ceil(cWindow/SYSTEM_PERIOD)) * SYSTEM_PERIOD;
				float minToTCoarse = (floor(minToT/SYSTEM_PERIOD) - 2) * SYSTEM_PERIOD;
				sink =	new CoarseSorter(
					new CoincidenceFilter(systemInformation, cWindowCoarse, minToTCoarse,
					new RawHitWriterHandler(writer,
					new NullSink<RawHit>()
					)));
			}
		}
		
		unsigned bs = shm->getSizeInFrames();
		unsigned rdPointer = blockHeader.rdPointer % (2*bs);
		unsigned wrPointer = blockHeader.wrPointer % (2*bs);
		while(rdPointer != wrPointer) {
			unsigned index = rdPointer % bs;
			
			long long frameID = shm->getFrameID(index);
			if(stepFirstFrameID == -1) stepFirstFrameID = frameID;
			if(frameID <= lastFrameID) {
				fprintf(stderr, "WARNING!! Frame ID reversal: %12lld -> %12lld | %04u %04u %04u\n", 
					lastFrameID, frameID, 
					blockHeader.wrPointer, blockHeader.rdPointer, rdPointer
					);
					
					
				
			}
			else if ((lastFrameID >= 0) && (frameID != (lastFrameID + 1))) {
				// We have skipped one or more frame ID, so 
				// we account them as lost
				long long skippedFrames = (frameID - lastFrameID) - 1;
				stepGoodFrames += skippedFrames;
				stepLostFrames += skippedFrames;
				stepLostFrames0 += skippedFrames;
			}

			lastFrameID = frameID;
			minFrameID = minFrameID < frameID ? minFrameID : frameID;
			maxFrameID = maxFrameID > frameID ? maxFrameID : frameID;
			
			// Simply dump the raw data frame
			int frameSize = shm->getFrameSize(index);
			if (rawFrameFile != NULL) {
				DAQd::DataFrame *dataFrame = shm->getDataFrame(index);
				fwrite((void *)dataFrame->data, sizeof(uint64_t), frameSize, rawFrameFile);
			}

			int nEvents = shm->getNEvents(index);
			bool frameLost = shm->getFrameLost(index);
			
			if(outBuffer == NULL) {
				outBuffer = new EventBuffer<RawHit>(EVENT_BLOCK_SIZE, NULL);
			}
			
			for (int n = 0; !pipeWriterIsNull && n < nEvents; n++) {
				RawHit &p = outBuffer->getWriteSlot();
#ifdef __ENDOTOFPET__
				int feType = shm->getEventType(index, n);
#else
				const int feType = 0;
#endif
				if (feType == 0) {
					p.feType = RawHit::TOFPET;
					unsigned tCoarse = shm->getTCoarse(index, n);
					unsigned eCoarse = shm->getECoarse(index, n);
					p.time = (1024LL * frameID + tCoarse) * T;
					p.timeEnd = (1024LL * frameID + eCoarse) * T;
					if((p.timeEnd - p.time) < -256*T) p.timeEnd += (1024LL * T);
					p.channelID = 64 * shm->getAsicID(index, n) + shm->getChannelID(index, n);
					p.d.tofpet.tac = shm->getTACID(index, n);
					p.d.tofpet.tcoarse = tCoarse;
					p.d.tofpet.ecoarse = eCoarse;
					p.d.tofpet.tfine =  shm->getTFine(index, n);
					p.d.tofpet.efine = shm->getEFine(index, n);
					p.channelIdleTime = shm->getChannelIdleTime(index, n);
					p.d.tofpet.tacIdleTime = shm->getTACIdleTime(index, n);
				}
				else if (feType == 1) {
					p.feType = RawHit::STIC;
					unsigned tCoarse = shm->getTCoarse(index, n);
					unsigned eCoarse = shm->getECoarse(index, n);
					// Compensate for LFSR's 2^16-1 period
					// and wrap at frame's 6.4 us period
					int ctCoarse = STICv3::Sticv3Handler::compensateCoarse(tCoarse, frameID) % 4096;
					int ceCoarse = STICv3::Sticv3Handler::compensateCoarse(eCoarse, frameID) % 4096;
					p.time = 1024LL * frameID * T + ctCoarse * T/4;
					p.timeEnd = 1024LL * frameID * T + ceCoarse * T/4;
					if((p.timeEnd - p.time) < -256*T) p.timeEnd += (1024LL * T);
					p.channelID = 64 * shm->getAsicID(index, n) + shm->getChannelID(index, n);
					p.d.stic.tcoarse = tCoarse;
					p.d.stic.ecoarse = eCoarse;
					p.d.stic.tfine =  shm->getTFine(index, n);
					p.d.stic.efine = shm->getEFine(index, n);
					p.channelIdleTime = shm->getChannelIdleTime(index, n);
					p.d.stic.tBadHit = shm->getTBadHit(index, n);
					p.d.stic.eBadHit = shm->getEBadHit(index, n);
				} else {
					continue;
				}
				
				outBuffer->pushWriteSlot();
				
			}
			
			if(outBuffer->getSize() >= (EVENT_BLOCK_SIZE - DAQd::MaxDataFrameSize)) {
				long long tMin = lastMaxFrameID * 1024 * T;
				long long tMax = (maxFrameID+1) * 1024 * T - 1;
				outBuffer->setTMin(tMin);
				outBuffer->setTMax(tMax);
				lastMaxFrameID = maxFrameID;
				sink->pushEvents(outBuffer);
				outBuffer = NULL;
				
			}

			stepEvents += nEvents;
			stepMaxFrame = stepMaxFrame > nEvents ? stepMaxFrame : nEvents;
			if(frameLost) {
				stepLostFrames += 1;
				if(nEvents == 0) 
					stepLostFrames0 += 1;
			}			
			stepGoodFrames += 1;
			
			rdPointer = (rdPointer+1) % (2*bs);
		}		
		
		if(blockHeader.endOfStep != 0) {
			if(sink != NULL) {
				if(outBuffer != NULL) {
					long long tMin = lastMaxFrameID * 1024 * T;
					long long tMax = (maxFrameID+1) * 1024 * T - 1;
					outBuffer->setTMin(tMin);
					outBuffer->setTMax(tMax);
					lastMaxFrameID = maxFrameID;
					sink->pushEvents(outBuffer);
					outBuffer = NULL;
				}
			
				sink->finish();
				sink->report();
				delete sink;
				sink = NULL;
				writer->closeStep();
			}

			fprintf(stderr, "writeRaw:: Step had %lld frames with %lld events; %f events/frame avg, %d event/frame max\n", 
					stepGoodFrames, stepEvents, 
					float(stepEvents)/stepGoodFrames,
					stepMaxFrame); fflush(stderr);
			fprintf(stderr, "writeRaw:: %d (%5.1f%%) frames received had missing data; %d (%5.1f%%) of had no data at all\n", 
					stepLostFrames, 100.0 * stepLostFrames / stepGoodFrames,
					stepLostFrames0, 100.0 * stepLostFrames0 / stepGoodFrames
					); 
			fflush(stderr);
			stepGoodFrames = 0;
			stepEvents = 0;
			stepMaxFrame = 0;
			stepLostFrames = 0;
			stepLostFrames0 = 0;
			lastFrameID = -1;
			stepFirstFrameID = -1;
		}

		fwrite(&rdPointer, sizeof(uint32_t), 1, stdout);
		fflush(stdout);

	
	}

	delete writer;
	delete systemInformation;
	if(rawFrameFile != NULL)
		fclose(rawFrameFile);
	
	return 0;
}
void RawReader::run()
{

	unsigned nWraps = 0;
	
	EventBuffer<RawPulse> *outBuffer = NULL;
	
	int nEventsInFrame = 0;
	
	long long tMax = 0, lastTMax = 0;
	long long FrameID;
	
	sink->pushT0(0);
	
	long long minFrameID = LLONG_MAX;
	long long maxFrameID = LLONG_MIN;
	uint8_t code;
	
	long long events=0;
	int bytes;
	while (fread(&code, 1, 1, dataFile) == 1) {
		  events++;
		  
		  
		  if(code>0x03){
				fprintf(stderr, "Impossible code: %u, at event %ld\n\n", code, events);
				break;
		  }
		  fseek(dataFile, -1, SEEK_CUR);
		
		
			
		  switch(code){
		  case 0:{
				StartTime rawStartTime;
				bytes= fread(&rawStartTime, sizeof(StartTime), 1, dataFile);
				AcqStartTime=rawStartTime.time;
				//fprintf(stderr, "rawStartTime=%d %d\n",rawStartTime.code,rawStartTime.time);
				continue;
		  }
		  case 1:{
				FrameHeader rawFrameHeader;
				bytes=fread(&rawFrameHeader, sizeof(FrameHeader), 1, dataFile);
				CurrentFrameID=rawFrameHeader.frameID;
				//fprintf(stderr, "Current frameID= %d %lld %lld\n", rawFrameHeader.code,rawFrameHeader.frameID,rawFrameHeader.drift   );
				continue;
		  }
		  case 2:{
				RawTOFPET rawEvent;
		
				bytes=fread(&rawEvent, sizeof(RawTOFPET), 1, dataFile);
				//fprintf(stderr, "tof.struct=%d\n %d\n %d\n %ld\n %ld\n %ld\n %lld\n %lld\n \n\n", rawEvent.code, rawEvent.tac, rawEvent.channelID,rawEvent.tCoarse,  rawEvent.eCoarse, rawEvent.tFine , rawEvent.eFine , rawEvent.tacIdleTime , rawEvent.channelIdleTime );
				if(outBuffer == NULL) {
					  outBuffer = new EventBuffer<RawPulse>(outBlockSize);
				}
				
			
				RawPulse &p = outBuffer->getWriteSlot();
				


				// Carefull with the float/double/integer conversions here..
				p.T = T * 1E12;
				p.time = (1024LL * CurrentFrameID + rawEvent.tCoarse) * p.T;
				p.timeEnd = (1024LL * CurrentFrameID + rawEvent.eCoarse) * p.T;
				if((p.timeEnd - p.time) < -256*p.T) p.timeEnd += (1024LL * p.T);
				p.channelID = rawEvent.channelID;
				p.channelIdleTime = rawEvent.channelIdleTime;
				p.region = rawEvent.channelID / 16;
				p.feType = RawPulse::TOFPET;
				p.d.tofpet.tac = rawEvent.tac;
				p.d.tofpet.tcoarse = rawEvent.tCoarse;
				p.d.tofpet.ecoarse = rawEvent.eCoarse;
				p.d.tofpet.tfine =  rawEvent.tFine;
				p.d.tofpet.efine = rawEvent.eFine;
				p.d.tofpet.tacIdleTime = rawEvent.tacIdleTime;

				//printf("DBG T frameID = %20lld tCoarse = %6u time = %20lld\n", CurrentFrameID, rawEvent.tCoarse, p.time);

				if(CurrentFrameID < minFrameID) minFrameID = CurrentFrameID;
				if(CurrentFrameID > maxFrameID) maxFrameID = CurrentFrameID;
				
				if(p.channelID >= SYSTEM_NCHANNELS)
					  continue;
				
				if(p.time > tMax)
					  tMax = p.time;
				
				outBuffer->pushWriteSlot();
				
				if(outBuffer->getSize() >= (outBlockSize - 512)) {
					  outBuffer->setTMin(lastTMax);
					  outBuffer->setTMax(tMax);		
					  sink->pushEvents(outBuffer);
					  outBuffer = NULL;
				}
				continue;
		  }
		  case 3:{
				RawSTICv3 rawEvent2;
				
				fread(&rawEvent2, sizeof(RawSTICv3), 1, dataFile);
				
				if(outBuffer == NULL) {
					  outBuffer = new EventBuffer<RawPulse>(outBlockSize);
				}
				
				
				RawPulse &p = outBuffer->getWriteSlot();
			
				//long long clocksElapsed = CurrentFrameID *1024*4ULL;
				long long clocksElapsed = (CurrentFrameID%256) *1024*4ULL;	// Periodic reset every 256 frames
				long long wrapNumber	= clocksElapsed / 32767;
				long long wrapRemainder	= clocksElapsed % 32767;

				unsigned tCoarse = rawEvent2.tCoarse;
				unsigned eCoarse = rawEvent2.eCoarse;

				if(tCoarse < wrapRemainder)
					tCoarse += 32767;
				tCoarse -= wrapRemainder;

				
				if(eCoarse < wrapRemainder)
					eCoarse += 32767;
				eCoarse -= wrapRemainder;

				//printf("wrapRemainder: %6lld\n", wrapRemainder);
				//printf("tCoarse: %6lu %6lu\n", rawEvent2.tCoarse, tCoarse);

			
				p.T = T * 1E12;
				p.time = 1024LL * CurrentFrameID * p.T + tCoarse * p.T/4;
				p.timeEnd = 1024LL * CurrentFrameID * p.T + eCoarse * p.T/4;
				if((p.timeEnd - p.time) < -256*p.T) p.timeEnd += (1024LL * p.T);
				p.channelID = rawEvent2.channelID;
				p.channelIdleTime = rawEvent2.channelIdleTime;
				
				
				p.feType = RawPulse::STIC;
				p.d.stic.tcoarse = rawEvent2.tCoarse;
				p.d.stic.ecoarse = rawEvent2.eCoarse;
				p.d.stic.tfine =  rawEvent2.tFine;
				p.d.stic.efine = rawEvent2.eFine;
				p.d.stic.tBadHit = rawEvent2.tBadHit;
				p.d.stic.eBadHit = rawEvent2.eBadHit;
				
				//printf("DBG S frameID = %20lld tCoarse = %6u time = %20lld\n", CurrentFrameID, tCoarse >> 2, p.time);
		
				if(CurrentFrameID < minFrameID) minFrameID = CurrentFrameID;
				if(CurrentFrameID > maxFrameID) maxFrameID = CurrentFrameID;
				
				if(p.channelID >= SYSTEM_NCHANNELS)
					  continue;
				
				if(p.time > tMax)
					  tMax = p.time;
				
				outBuffer->pushWriteSlot();
				
				if(outBuffer->getSize() >= (outBlockSize - 512)) {
					  outBuffer->setTMin(lastTMax);
					  outBuffer->setTMax(tMax);		
					  sink->pushEvents(outBuffer);
					  outBuffer = NULL;
				}
				continue;
		  }
				
		  }
		
		
	}

	
	if(outBuffer != NULL) {
		outBuffer->setTMin(lastTMax);
		outBuffer->setTMax(tMax);		
		sink->pushEvents(outBuffer);
		outBuffer = NULL;
		
	}
	
	sink->finish();
	
	fprintf(stderr, "RawReaderV2 report\n");
	fprintf(stderr, "\t%16lld minFrameID\n", minFrameID);
	fprintf(stderr, "\t%16lld maxFrameID\n", maxFrameID);
	sink->report();
}
void RawReaderV2::run()
{

	unsigned nWraps = 0;
	
	EventBuffer<RawPulse> *outBuffer = NULL;
	
	int nEventsInFrame = 0;
	
	long long tMax = 0, lastTMax = 0;

	sink->pushT0(0);
	
	long long minFrameID = LLONG_MAX;
	long long maxFrameID = LLONG_MIN;
	
	fprintf(stderr, "Reading %llu to %llu\n", eventsBegin, eventsEnd);
	fseek(dataFile, eventsBegin * sizeof(RawEventV2), SEEK_SET);
	
	int maxReadBlock = 1024*1024;
	RawEventV2 *rawEvents = new RawEventV2[maxReadBlock];

	unsigned long long readPointer = eventsBegin;
	while (readPointer < eventsEnd) {
		unsigned long long count = eventsEnd - readPointer;
		if(count > maxReadBlock) count = maxReadBlock;
		int r = fread(rawEvents, sizeof(RawEventV2), count, dataFile);
		if(r <= 0) break;
		readPointer += r;
	
		//printf("events extracted= %lld\n",readPointer);
	
		for(int j = 0; j < r; j++) {
			RawEventV2 &rawEvent = rawEvents[j];

			if(outBuffer == NULL) {
				outBuffer = new EventBuffer<RawPulse>(outBlockSize);
			}
		

			RawPulse &p = outBuffer->getWriteSlot();
			
			// Carefull with the float/double/integer conversions here..
			p.T = T * 1E12;
			p.time = (1024LL * rawEvent.frameID + rawEvent.tCoarse) * p.T;
			p.timeEnd = (1024LL * rawEvent.frameID + rawEvent.eCoarse) * p.T;
			if((p.timeEnd - p.time) < -256*p.T) p.timeEnd += (1024LL * p.T);
			p.channelID = (64 * rawEvent.asicID) + rawEvent.channelID;
			p.channelIdleTime = rawEvent.channelIdleTime;
			p.region = (64 * rawEvent.asicID + rawEvent.channelID) / 16;
			p.feType = RawPulse::TOFPET;
			p.d.tofpet.tac = rawEvent.tacID;
			p.d.tofpet.tcoarse = rawEvent.tCoarse;
			p.d.tofpet.ecoarse = rawEvent.eCoarse;
			p.d.tofpet.tfine =  rawEvent.tFine;
			p.d.tofpet.efine = rawEvent.eFine;
			p.channelIdleTime = rawEvent.channelIdleTime;
			p.d.tofpet.tacIdleTime = rawEvent.tacIdleTime;
		
			if(rawEvent.frameID < minFrameID) minFrameID = rawEvent.frameID;
			if(rawEvent.frameID > maxFrameID) maxFrameID = rawEvent.frameID;
				
			if(p.channelID >= SYSTEM_NCHANNELS)
				continue;
		
			if(p.time > tMax)
				tMax = p.time;
		
			outBuffer->pushWriteSlot();
		
			if(outBuffer->getSize() >= outBlockSize) {
				outBuffer->setTMin(lastTMax);
				outBuffer->setTMax(tMax);
				sink->pushEvents(outBuffer);
				lastTMax = tMax;
				outBuffer = NULL;
			}
		}
	}
	
	delete [] rawEvents;

	
	if(outBuffer != NULL) {
		outBuffer->setTMin(lastTMax);
		outBuffer->setTMax(tMax);		
		sink->pushEvents(outBuffer);
		outBuffer = NULL;
		
	}
	
	sink->finish();
	
	fprintf(stderr, "RawReaderV2 report\n");
	fprintf(stderr, "\t%16lld minFrameID\n", minFrameID);
	fprintf(stderr, "\t%16lld maxFrameID\n", maxFrameID);
	sink->report();
}