40 json trackArray = json::array();
42 const auto& trigRec = trackTrigRecs[iEvent];
43 for (
int iTrack = 0; iTrack < trigRec.getNumberOfTracks(); ++iTrack) {
44 TrackTRD track = tracks[iTrack + trigRec.getFirstTrack()];
45 std::string trackId = Form(
"E%d_T%d", iEvent, iTrack);
47 float alpha = track.getAlpha();
49 alpha += TMath::Pi() * 2;
52 int sector = TMath::Nint(18.0 *
alpha / (2 * TMath::Pi()) - 0.5);
54 for (
int iLayer = 0; iLayer < 6; iLayer++) {
55 int trackletIdx = track.getTrackletIndex(iLayer);
56 if (trackletIdx != -1) {
57 int detector =
tracklets[trackletIdx].getDetector();
58 stack = detector % 30 / 6;
64 float tanLambda = track.getParam(3);
65 float lambdaDeg = TMath::ATan(tanLambda) * 180 / TMath::Pi();
68 int layerZero = mGeo->getDetector(0,
stack, sector);
69 mUsedDetectors.set(layerZero);
76 {
"i", {{
"pT", track.getPt()}, {
"alpha", track.getAlpha()}, {
"lambda", lambdaDeg}, {
"pid", (
int)track.getPID().getID()}}},
77 {
"path", json::array()},
78 {
"tlids", json::array()}};
81 for (
int x = 1;
x <= 470;
x += 10) {
82 auto xyz = track.getXYZGloAt(
x, mBz, ok);
83 json point = {{
"x", xyz.X()}, {
"y", xyz.Y()}, {
"z", xyz.Z()}};
84 trackJson[
"path"].push_back(point);
88 for (
int iLayer = 0; iLayer < 6; iLayer++) {
90 int trackletIdx = track.getTrackletIndex(iLayer);
91 if (trackletIdx != -1) {
92 int trackletCount = 0;
94 for (
int i = 0;
i < iEvent;
i++) {
95 trackletCount += mTrigRecs[
i].getNumberOfTracklets();
98 std::string trackletId = Form(
"E%d_L%d", iEvent, trackletIdx - trackletCount);
100 mTrackletMap.insert(std::pair<std::string, std::string>(trackletId, trackId));
101 trackJson[
"tlids"].push_back(trackletId);
104 trackArray.push_back(trackJson);
111 json trackletArray = json::array();
113 const auto& trigRec = mTrigRecs[iEvent];
114 for (
int iTracklet = 0; iTracklet < trigRec.getNumberOfTracklets(); ++iTracklet) {
118 std::string trackletId = Form(
"E%d_L%d", iEvent, iTracklet);
120 std::string trackId = (mTrackletMap.find(trackletId) != mTrackletMap.end() ? mTrackletMap.at(trackletId) :
"null");
122 int detector = tracklet.getDetector();
123 int sector = mGeo->getSector(detector);
124 int stack = mGeo->getStack(detector);
125 int layer = mGeo->getLayer(detector);
128 float localY = cTracklet.getY();
130 float rawDyDx = tracklet.getUncalibratedDy() / mGeo->cdrHght();
132 float dyDx = cTracklet.getDy() / mGeo->cdrHght();
134 json trackletJson = {
139 {
"row", tracklet.getPadRow()},
143 {
"dyDxAN", rawDyDx}};
145 if (trackId ==
"null") {
146 trackletJson[
"trk"] =
nullptr;
149 trackletArray.push_back(trackletJson);
151 return trackletArray;
156 const auto& trigRec = mTrigRecs[iEvent];
158 if (mUsedDetectors[det]) {
159 int sector = mGeo->getSector(det);
160 int stack = mGeo->getStack(det);
164 {
"lyrs", json::array()}};
166 for (
int iLayer = 0; iLayer < 6; iLayer++) {
169 {
"pads", json::array()}};
171 for (
int iDigit = trigRec.getFirstDigit(); iDigit < trigRec.getFirstDigit() + trigRec.getNumberOfDigits(); ++iDigit) {
176 if (detector == det + iLayer) {
184 {
"tbins", json::array()}};
187 padJson[
"tbins"].push_back(
adc);
189 layerJson[
"pads"].push_back(padJson);
192 digitsJson[
"lyrs"].push_back(layerJson);
194 std::ofstream digitsOut(Form(
"../alice-trd-event-display/data/o2/E%d.%d.%d.json", iEvent, sector,
stack));
195 digitsOut << digitsJson.dump(4);
202 LOG(info) <<
"Running event display feed...";
204 json jsonData = json::array();
206 auto tracks = pc.
inputs().
get<gsl::span<TrackTRD>>(
"trdtracks");
210 mTrigRecs = pc.
inputs().
get<gsl::span<TriggerRecord>>(
"trdtriggerrec");
211 auto trackTrigRecs = pc.
inputs().
get<gsl::span<TrackTriggerRecord>>(
"tracktriggerrec");
213 int nEvents = std::min((
int)mTrigRecs.size(), mNeventsMax);
215 for (
int iEvent = 0; iEvent <
nEvents; ++iEvent) {
216 const auto& trackTrigRec = trackTrigRecs[iEvent];
218 if (trackTrigRec.getNumberOfTracks() == 0) {
222 mUsedDetectors.reset();
227 mBz = prop->getNominalBz();
230 double beamEnergy = field->getBeamEnergy();
231 std::string beamType = field->getBeamTypeText();
234 auto triggers = grp->getDetsTrigger();
238 {
"id", Form(
"E%d", iEvent)},
239 {
"i", {{
"be", beamEnergy}, {
"bt", beamType}, {
"ft", triggerNames}}},
240 {
"tracks", json::array()},
241 {
"trklts", json::array()}};
249 jsonData.push_back(eventJson);
251 std::ofstream jsScriptOut(Form(
"../alice-trd-event-display/data/o2/script.js"));
254 jsScriptOut <<
"function getDigitsLoadUrl(eventNo, sector, stack) { return `"
255 <<
"data/o2/${eventNo}.${sector}.${stack}.json`; }"
258 <<
"function getData() {\n\treturn "
259 << jsonData.dump(4) <<
"}";
264 std::vector<InputSpec> inputs;
265 std::vector<OutputSpec> outputs;
267 inputs.emplace_back(
"trdtracks",
"TRD",
"MATCH_ITSTPC", 0, Lifetime::Timeframe);
268 inputs.emplace_back(
"trdtracklets",
"TRD",
"TRACKLETS", 0, Lifetime::Timeframe);
270 inputs.emplace_back(
"trdtriggerrec",
"TRD",
"TRKTRGRD", 0, Lifetime::Timeframe);
271 inputs.emplace_back(
"tracktriggerrec",
"TRD",
"TRGREC_ITSTPC", 0, Lifetime::Timeframe);
274 "TRDEVENTDISPLAYFEED",
277 AlgorithmSpec{adaptFromTask<TRDEventDisplayFeedSpec>(nEventsMax)},
InputRecord & inputs()
The inputs associated with this processing context.